2 回答

TA贡献1859条经验 获得超6个赞
因为您使用超类的名称作为泛型类型,所以您使用的是超类在 ArrayList 中提供的接口。
您可以将子类类型添加到列表中,但是如果不首先检查对象是哪个子类,然后对子类进行强制转换,就不能安全地使用子类中引入的唯一方法。
这是一个例子:
public class A {
public void methodFromA() {
System.out.println("From class A");
}
}
public class B extends A {
public void methodFromB() {
System.out.println("From class B");
}
}
public class C extends A {
public void methodFromC() {
System.out.println("From class C");
}
}
以下是这些正在使用的类,使用具有超类类型的 ArrayList:
public static void main(String[] args) {
List<A> myList = new ArrayList<>();
A object1 = new A();
B object2 = new B();
C object3 = new C();
myList.add(object1);
myList.add(object2);
myList.add(object3);
for (A object : myList) {
object.methodFromA();
if (object instanceof B) {
B castedObject = (B) object;
castedObject.methodFromB();
}
else if (object instanceof C) {
C castedObject = (C) object;
castedObject.methodFromC();
}
}
}
结果输出:
From class A
From class A
From class B
From class A
From class C
至于使用实例变量,它们应该由公共 getter 和 setter 访问,在检查和转换后使用,如上所示。

TA贡献1883条经验 获得超3个赞
首先,如果您无法调用将反映到具体子类的超类方法,则意味着您的设计不好,您应该再做一次。
但是,无论如何,您都可以从 arraylist 中获取项目并使用以下命令进行检查instanceof:
if (item instanceof FirstSubClass){
FirstSubClass f = (FirstSubClass) item;
f.methodInFirst();
} else if (...)
.....
添加回答
举报