包含继承 类 的 SuperClass 的 ArrayList
ArrayList of SuperClass containing inherited classes
假设我有一个 class A,它有一些方法。然后我有一个扩展 A 的 class B,但有一个额外的变量。现在我想在另一个 class 中同时拥有 A 和 B 的 ArrayList,这样当我遍历列表时,即使用 .getName()
方法,我得到两个 class 的名称是吗?我是创建一个 ArrayList<A>
并向其中添加 A 和 B 的实例,还是创建一个 ArrayList<Object>
?在 ArrayList<Objects>
的情况下,如何在不同的对象上调用 .getName()
?
您将创建类型参数设置为 A 的 ArrayList。B 继承了 A 的所有属性和方法,这意味着您可以在 B 中以与在 A 中访问它们完全相同的方式访问它们。但是如果你想访问 A 中不存在的 B 中的 属性,你必须强制转换它。例如,
for (A p: aList) {
p.methodFromA();
if (p instanceof B) {
B q = (B) p;
q.methodOnlyBHas();
// or
((B)p).methodOnlyBHas();
}
}
如果您创建了对象的 ArrayList,则必须将每个元素转换为您想要的 class。这几乎否定了泛型背后的想法,并且与创建没有类型参数的 ArrayList 没有什么不同。您应该避免这样做,以便获得泛型给您带来的好处,例如,在编译时出现类型错误,而不是在运行时抛出异常。
ArrayList<A>
将适用于 A 和 B,无需进行更多概括,即 Object.
如何调用getName()
取决于getName()
的定义位置。
如果它在A
中,你可以在ArrayList
中的所有对象中调用它,但如果该方法只在B
中,你可能需要检查instanceof B
和然后调用方法。
假设我有一个 class A,它有一些方法。然后我有一个扩展 A 的 class B,但有一个额外的变量。现在我想在另一个 class 中同时拥有 A 和 B 的 ArrayList,这样当我遍历列表时,即使用 .getName()
方法,我得到两个 class 的名称是吗?我是创建一个 ArrayList<A>
并向其中添加 A 和 B 的实例,还是创建一个 ArrayList<Object>
?在 ArrayList<Objects>
的情况下,如何在不同的对象上调用 .getName()
?
您将创建类型参数设置为 A 的 ArrayList。B 继承了 A 的所有属性和方法,这意味着您可以在 B 中以与在 A 中访问它们完全相同的方式访问它们。但是如果你想访问 A 中不存在的 B 中的 属性,你必须强制转换它。例如,
for (A p: aList) {
p.methodFromA();
if (p instanceof B) {
B q = (B) p;
q.methodOnlyBHas();
// or
((B)p).methodOnlyBHas();
}
}
如果您创建了对象的 ArrayList,则必须将每个元素转换为您想要的 class。这几乎否定了泛型背后的想法,并且与创建没有类型参数的 ArrayList 没有什么不同。您应该避免这样做,以便获得泛型给您带来的好处,例如,在编译时出现类型错误,而不是在运行时抛出异常。
ArrayList<A>
将适用于 A 和 B,无需进行更多概括,即 Object.
如何调用getName()
取决于getName()
的定义位置。
如果它在A
中,你可以在ArrayList
中的所有对象中调用它,但如果该方法只在B
中,你可能需要检查instanceof B
和然后调用方法。