0

在处理中,我有一个从自定义类构建的对象的 ArrayList。当我使用该.get()函数返回其中一个对象时,它似乎可以正常返回该对象——但我无法访问该对象的任何变量或方法。我收到错误消息“[variable] 无法解析或不是字段。” 这是一个错误,还是我做错了什么?

这是一个示例。注意从setup()函数返回的值。

// regular array
Thing[] thinglist1 = new Thing[1];

// ArrayList array
ArrayList thinglist2 = new ArrayList<Thing>(1);

// instantiate the class
Thing thing = new Thing(12345);

// class definition
class Thing {
  int var;

  Thing(int i){
    var = i;
    thinglist1[0] = this;
    thinglist2.add(this);
  };
};

// run it!
void setup(){
  println(thinglist1[0] == thinglist2.get(0));
  // true

  println(thinglist1[0].var);
  // 12345

  println(thinglist2.get(0).var);
  // ERROR: "var cannot be resolved or is not a field"
};
4

2 回答 2

9

你有点搞砸了你的泛型。

改变

ArrayList thinglist2 = new ArrayList<Thing>(1);

至:

ArrayList<Thing> thinglist2 = new ArrayList<Thing>(1);

因为您没有指定类型,所以您真正拥有的是:

ArrayList<? extends Object> thinglist2 = new ArrayList<Thing>(1);

因此,当您使用 从中检索项目时get,它被键入为Object而不是您的Thing

编辑添加:原因是遗留;当引入泛型时,为了向后兼容,事情已经到位。不幸的是,这会产生这样的情况,这让 Java 新手感到困惑。

您可能会期待编译器警告或错误,但 Java 默默地将非泛型类型更改ArrayList为“包含扩展对象的东西的 Arraylist”......这是任何东西(除了原语),因为所有对象都隐式扩展Object

于 2013-06-23T04:08:09.420 回答
-2

在最后一行中,您必须将 get 函数的返回值转换为对象数组。

System.out.println(((Thing[])thinglist2.get(0))[0].var);
于 2013-06-23T04:17:39.833 回答