ArrayList.get()是否返回与array []相同的东西?

时间:2013-06-23 04:05:01

标签: java arraylist processing

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

这是一个样本。请注意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"
};

2 个答案:

答案 0 :(得分: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静默地更改为“包含扩展Object的内容的Arraylist”......这是任何内容(除了原语) ,因为所有对象都隐含地扩展Object

答案 1 :(得分:-2)

在最后一行中,必须将get函数的返回值强制转换为object数组。

System.out.println(((Thing[])thinglist2.get(0))[0].var);