android访问扩展customListAdapter的成员变量

时间:2011-11-11 12:54:28

标签: java android syntax

我在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);

有人可以解释一下这种语法和需要这样的演员吗?! ......以及出了什么问题:

  • 实例化对象
  • 访问公共setter / getters或直接成员变量

1 个答案:

答案 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();