在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"
};
答案 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);