【问题标题】:Using ArrayList of abstract class使用抽象类的ArrayList
【发布时间】:2014-09-13 12:14:57
【问题描述】:

我有一个抽象类 C0。 我还有其他几个从 C0 继承的类。它们覆盖抽象方法并拥有自己的特殊方法。

我想创建一个包含所有这些专用类的 ArrayList。

这是一段代码,展示了我(想要)如何做到这一点:

ArrayList<C0> A = new ArrayList<>();
A.add(new C1() );
A.add(new C2() );

A.get(x).method_of_C0(); // Works because my classes extend C0.
A.get(0).method_of_C1(); // Does not work
A.get(1).method_of_C2(); // Does not work

我希望能够通过这个 ArrayList 调用 C1 和 C2 自己的方法。那可能吗?我通过手动投射尝试了一些调整,但没有成功。

【问题讨论】:

  • => 看看“多态性”
  • 难的是看,有没有通过Reflection的方法

标签: java generics arraylist casting


【解决方案1】:

您要么需要保留一个单独的 C1 和 C2 实例的 ArrayList,要么必须将它们转换为各自的类型才能使用子类型的方法。比如:

A.get(x).method_of_C0();
((C1)A.get(0)).method_of_C1();
((C2)A.get(1)).method_of_C2();

在进行强制转换之前,您还可以使用 instanceof 关键字来检查元素是否实际上是特定子类型的实例,否则您将收到 ClassCastException。

但请注意,这具有非常糟糕的代码气味,因此根据需要跟踪每个子类型可能是要走的路。

【讨论】:

    【解决方案2】:

    这里的问题是在实例化 ArrayList 的新实例时没有声明对象类型。
    这是解决问题的最简单方法:

    ArrayList<C0> A = new ArrayList<C0>();
    A.add( new C1() );
    A.add( new C2() );
    

    现在下面的代码行应该可以工作了。只要 C1 和 C2 是 C0 的子类。

    A.get(0).method_C1();
    A.get(1).method_C2(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2017-11-04
      相关资源
      最近更新 更多