【问题标题】:Can I have a list of 2 inherited types of classes in java?我可以在 java 中列出 2 种继承类型的类吗?
【发布时间】:2016-01-03 03:42:13
【问题描述】:

我有一个父类和一个子类 Child。我想创建一个 ArrayList 来存储这两个类的对象。 有这样的可能吗?

我尝试了以下操作:

ArrayList<Parent> list= new ArrayList<Parent>();
Parent a;
Parent b;
Child c;
list.add(a);
list.add(b);
list.add(c);

到目前为止,编译器没有给我任何错误,所以我想没关系。但是,当我尝试对从 ArrayList 获得的对象使用 Child 的方法时,我无法使用它! 而

list.get(2).countNumbers(); 

这给我一个错误,方法countNumbers在Child中。我很困惑,提前谢谢!

【问题讨论】:

  • 请说明错误是什么。仅仅说您收到错误并不足以说明您所看到的内容。
  • stackoverflow.com/questions/897935/…。这应该可以帮助你。虽然在你的情况下类型转换或使用T extends SomeClass
  • 错误是找不到符号...我认为很清楚,抱歉给您带来不便
  • 只是一个不相关的说明:您应该使用List 接口而不是ArrayList 实现:List&lt;Parent&gt; list = new ArrayList&lt;Parent&gt;();。这使您的代码更具可扩展性。

标签: java inheritance arraylist parent-child


【解决方案1】:

ArrayList&lt;Parent&gt;Parent 的容器,因此您可以将任何Parent 的对象放入其中。 Child 当然是Parent,所以ArrayList&lt;Parent&gt; 可以接收。

但是,由于您的ArrayList&lt;Parent&gt; 只知道它包含Parent,它不知道其中的对象是否为Child。因此编译器不允许您将其中的元素视为Children,尽管它在运行时可能是Child。因此,如果您确定Parent 对象也是Child,则可以将其向下转换为Child child = (Child) object;。然后您可以在编译时将其视为Child。但请注意,向下转换不是类型安全的,它可能会引发运行时异常。

【讨论】:

    【解决方案2】:

    你想声明你的列表:

    List<Parent> list = new ArrayList<>();
    

    这将告诉 Java 你接受任何扩展或作为父类的类。

    由于List 将包含Parent 类型,要使用Child 对象,您必须对其进行强制转换:

    Parent o = list.get(x);
    if (o instanceof Child) {
        Child child = (Child) o;
        // Do something with child
    }
    

    【讨论】:

    • 我赞成你的回答。 OP,您仍然必须将list.get(0) 转换为Child,然后才能使用countNumbers() 方法。下面 ProtossShuttle 的回答解释了原因。
    • 您不能对声明为 List&lt;? extends Parent&gt; 的类型调用 add 方法。您只需像 OP 一样将其声明为 List&lt;Parent&gt; 即可。不要让它变得比必要的更复杂(和错误)。
    • 那么我应该像@ErwinBolwidt 所说的那样,然后像 Guillaume F. 和 spork 所说的那样继续吗?
    • @John 你不能按照 Guillaume 的建议去做,因为当你尝试做 list.add(a); 时它会给你一个编译错误。但是,您需要像 ProtossShuttle 和 Guillaume 建议的那样使用 (Child) 的演员表
    • 我可以写o=(Child) o; 而不是return (Child) o; 吗? @ErwinBolwidt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多