Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展customListAdapter的android access成员变量_Java_Android_Syntax - Fatal编程技术网

Java 扩展customListAdapter的android access成员变量

Java 扩展customListAdapter的android access成员变量,java,android,syntax,Java,Android,Syntax,我在android和Java中都面临着奇怪的OOP行为(IMO)。。。 我有一个活动,在它里面我实例化了一个CustomSimpleCursorAdapter的对象,它是一个扩展SimpleCursorAdapter的类。在我的自定义类中添加了一些成员变量。 当我创建该类的对象时,我希望能够访问新创建的对象的成员变量。我的OOP经验告诉我以下几点就足够了: ListAdapter listAdapter = new TrainingsListCursorAdapter(...); listAda

我在android和Java中都面临着奇怪的OOP行为(IMO)。。。 我有一个活动,在它里面我实例化了一个
CustomSimpleCursorAdapter
的对象,它是一个扩展
SimpleCursorAdapter
的类。在我的自定义类中添加了一些成员变量。 当我创建该类的对象时,我希望能够访问新创建的对象的成员变量。我的OOP经验告诉我以下几点就足够了:

ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.currentWidth = 100;
注意:currentWith变量已声明为公共

(Eclipse)不想编译,所以我想定制类中的公共setter
setCurrentWidth()
可能会解决这个问题。我声明了一个成员变量private和我的setter方法public

ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.setCurrentWidth(100);
Eclipse也不高兴。。。我知道这是不可能的,但当你面对奇怪的行为时,你也开始表现出奇怪:))

eclipse入侵性地提供的更正最终起作用了!代码如下:

((TrainingsListCursorAdapter) listAdapter).setOrientationWidth(100);
有人能给我解释一下这种语法和这种铸造的需要吗?! …这有什么问题吗

  • 实例化一个对象
  • 访问it公共setters/getter或直接访问成员变量

  • 这一点也不奇怪。变量
    listAdapter
    只是类型
    listAdapter
    。编译器根本不关心前几行中发生了什么赋值。如果您试图通过
    ListAdapter
    访问未知成员,编译器将正确地进行投诉

    比强制转换更简单的修复方法是将变量声明为访问特定成员所需的类型:

    TrainingsListCursorAdapter listAdapter = new TrainingsListCursorAdapter(...);
    listAdapter.currentWidth = 100;
    

    因此,为了回答您的最后一点,实例化一个对象并访问公共成员并没有什么错。试图通过不知道这些成员的类型的变量来执行此操作是错误的

    要在常见类型中提供一个更简单的示例,您不能编写:

    Object text = "hello";
    int length = text.length();
    
    因为
    length()
    Object
    上的一个方法,所以它只在
    String
    上。当编译器看到表达式
    text.length()
    时,它会查看变量
    text
    的声明类型(即本例中的
    Object
    ),并查找该类型上的
    length()
    方法

    因此,要使上述代码正常工作,您需要这样做:

    String text = "hello";
    int length = text.length();
    

    我认为编译器将考虑父类的扩展。。。非常感谢你。。。你每天都能学到新东西;)@luigi7up:但是它怎么知道要考虑哪些子类呢?当使用类型为
    Object
    的变量时,您希望它找到每个子类的每个成员吗?
    String text = "hello";
    int length = text.length();