当对象扩展我在ArrayList泛型中编写的类型时,如何访问ArrayList中对象的字段?
下面是代码:
ArrayList<ObjectA> objA = new ArrayList()<>;
objA.add( new ObjectA() );
objA.add( new ObjectAB() ); // ObjectAB extends ObjectA
现在我想更改存储在列表
中的变量ObjectAB(只有ObjectAB有此字段,而不是ObjectA)
答案 0 :(得分:5)
如果我理解正确,你想做这样的事情:
ArrayList<ObjectA> objA = new ArrayList()<>;
objA.add( new ObjectA() );
objA.add( new ObjectAB() ); // ObjectAB extends ObjectA
ObjectAB ab = (ObjectAB) objA.get(1);
ab.setFieldFromAB("foo");
因此,您必须将列表objA中的项目转换为ObjectAB类型。如果您不确定演员表是否会成功,您可能需要先进行一些检查,如
if(objA.get(1) instanceof ObjectAB) {
ObjectAB ab = (ObjectAB) objA.get(1);
ab.setFieldFromAB("foo");
} else {
//doSomethingElse
}
答案 1 :(得分:1)
当您从ArrayList
检索回来的对象时,您将只获得ObjectA
类型的对象。
因为ArrayList<T>
是T
类型对象的列表。
ObjectA obj0 = objA.get(0);
ObjectA obj1 = objA.get(1); // This you cannot get as the reference of ObjectAB
您需要明确地将obj1
向下转发为ObjectAB
ObjectAB obj1B = (ObjectAB) obj1;
但是如果你真的需要明确的向下转换,那么你就是在打败泛型的目的 - 类型安全。肯定会有更好的方法。