【问题标题】:android access member variable of extended customListAdapter扩展customListAdapter的android访问成员变量
【发布时间】:2011-11-11 12:54:27
【问题描述】:

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

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

注意:currentWith 变量被声明为 public...

(Eclipse) 不想编译,所以我想也许自定义类中的公共设置器setCurrentWidth() 可以解决它。我声明了一个成员变量 private 和我的 setter 方法 public....

ListAdapter listAdapter = new TrainingsListCursorAdapter(...);
listAdapter.setCurrentWidth(100);

Eclipse 也不高兴...我知道这是一个很长的机会,但是当你面对奇怪的行为时,你也会开始表现得很奇怪 :)))

eclipse 侵入性地提供了更正,最终奏效了!是以下代码:

((TrainingsListCursorAdapter) listAdapter).setOrientationWidth(100);

有人可以解释一下这种语法和这种转换的需要吗?! ...以及有什么问题:

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

【问题讨论】:

    标签: java android syntax


    【解决方案1】:

    一点也不奇怪。变量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();
    

    【讨论】:

    • 我以为编译器会考虑父类的扩展...非常感谢...你每天都学到新东西;)
    • @luigi7up:但是它怎么知道要考虑哪些子类呢?当使用 Object 类型的变量时,您是否希望它找到 every 子类的 every 成员?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2020-12-14
    相关资源
    最近更新 更多