我在Android中面临奇怪的OOP行为(IMO),也许在Java中面临...
我有一个活动,在其中我实例化CustomSimpleCursorAdapter
的对象,这是一个扩展SimpleCursorAdapter
的类。在我的自定义类中,我添加了一些成员变量。
当我创建该类的对象时,我希望能够访问新创建的对象的成员变量。我的OOP经验告诉我,以下内容应该足够了:
ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.currentWidth = 100;
注意: currentWith 变量被声明为public ...
(Eclipse)不想编译,所以我想也许自定义类中的公共setter setCurrentWidth()
可以解决它。我声明了一个成员变量private和我的setter方法public ....
ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.setCurrentWidth(100);
Eclipse也不高兴......我知道这是一个很长的镜头,但是当你面对奇怪的行为时,你也会开始表现得很奇怪:)))
日食是侵入性提供的修正,最终是作品!是以下代码:
((TrainingsListCursorAdapter) listAdapter).setOrientationWidth(100);
有人可以解释一下这种语法和需要这样的演员吗?! ......以及出了什么问题:
答案 0 :(得分:3)
这一点都不奇怪。变量listAdapter
只是ListAdapter
类型。编译器不关心在前一行上发生了什么分配。如果您尝试访问通过ListAdapter
未知的成员,编译器将正确地抱怨。
比投射更简单的修复方法是将变量声明为您需要的类型,以便访问您的特定成员:
TrainingsListCursorAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.currentWidth = 100;
或
TrainingsListCursorAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.setOrientationWidth(100);
所以回答你的最后一点 - 实例化一个对象和访问公共成员没有错。尝试通过不知道这些成员的类型的变量尝试 。
要在常见类型中给出一个更简单的示例,您不能写:
Object text = "hello";
int length = text.length();
因为length()
是Object
上的方法,所以它只在String
上。当编译器看到表达式text.length()
时,它会查看变量text
的声明类型(在本例中为Object
)并查找该类型的length()
方法
所以这就是你要做的事情,以使上面的代码工作:
String text = "hello";
int length = text.length();