【问题标题】:ArrayList of SuperClass containing inherited classes [duplicate]包含继承类的超类的 ArrayList [重复]
【发布时间】:2016-03-06 20:21:53
【问题描述】:

假设我有一个 A 类,它有一些方法。然后我有一个扩展 A 的 B 类,但有一个额外的变量。现在我想在另一个类中有一个 A 和 B 的 ArrayList,这样当我使用 .getName() 方法遍历列表时,我得到了两个类的名称?我是创建一个 ArrayList<A> 并向其中添加 A 和 B 的实例,还是创建一个 ArrayList<Object> ?在ArrayList<Objects> 的情况下,如何在不同的对象上调用.getName()

【问题讨论】:

  • 如果我正确理解您的意图,您应该可以使用ArrayList<A>,因为 B 是 A 的子类。如果两个类都有 getName() 方法(B 将继承自A,但您也可以选择覆盖它),您只需要一个循环来遍历您的 ArrayList 并为 ArrayList 中的每个对象调用 getName() 方法。

标签: java inheritance arraylist superclass


【解决方案1】:

您将创建 ArrayList,并将 type 参数设置为 A。B 继承了 A 的所有属性和方法,这意味着您可以在 B 中访问它们,就像在 A 中访问它们一样。如果您愿意要访问 B 中不存在于 A 中的属性,您必须强制转换它。例如,

for (A p: aList) {
  p.methodFromA();
  if (p instanceof B) {
     B q = (B) p;
     q.methodOnlyBHas();
     // or
     ((B)p).methodOnlyBHas();
  }
}

如果您创建了一个对象的 ArrayList,则必须将每个元素强制转换为您想要的类。这几乎否定了泛型背后的想法,并且与创建没有类型参数的 ArrayList 没有什么不同。您应该避免这样做,以便获得泛型给您带来的好处,例如在编译时键入错误而不是在运行时强制转换异常。

【讨论】:

  • 但是如果我想打印出对象怎么办,即 A 得到了名为 name, size, color 的 som 变量,B 得到了相同的变量,但也有变量 `weight , how do I get all of the variables from A and all from B? Like: For(A p: aList){ print(p) }` 但我还想在 ArrayList<A> 中打印 B 类型的对象?如果有意义的话..
  • 我已经更新了答案,以便可以添加代码示例,希望对您有所帮助
  • 没问题,乐于助人:)
【解决方案2】:

ArrayList<A> 将适用于 A 和 B,无需进行更多概括,即 Object。

如何调用getName() 取决于getName() 的定义位置。 如果在A中,则可以在ArrayList中的所有对象中调用,但如果方法仅在B中,则可能需要检查instanceof B,然后调用该方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 2020-10-21
    • 2016-10-18
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多