Java 扩展customListAdapter的android access成员变量
我在android和Java中都面临着奇怪的OOP行为(IMO)。。。 我有一个活动,在它里面我实例化了一个Java 扩展customListAdapter的android access成员变量,java,android,syntax,Java,Android,Syntax,我在android和Java中都面临着奇怪的OOP行为(IMO)。。。 我有一个活动,在它里面我实例化了一个CustomSimpleCursorAdapter的对象,它是一个扩展SimpleCursorAdapter的类。在我的自定义类中添加了一些成员变量。 当我创建该类的对象时,我希望能够访问新创建的对象的成员变量。我的OOP经验告诉我以下几点就足够了: ListAdapter listAdapter = new TrainingsListCursorAdapter(...); listAda
CustomSimpleCursorAdapter
的对象,它是一个扩展SimpleCursorAdapter
的类。在我的自定义类中添加了一些成员变量。
当我创建该类的对象时,我希望能够访问新创建的对象的成员变量。我的OOP经验告诉我以下几点就足够了:
ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.currentWidth = 100;
注意:currentWith变量已声明为公共
(Eclipse)不想编译,所以我想定制类中的公共settersetCurrentWidth()
可能会解决这个问题。我声明了一个成员变量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();