包含继承 类 的 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和然后调用方法。