使用抽象类的ArrayList

时间:2014-07-22 15:22:32

标签: java generics arraylist casting

我有一个抽象类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和C2自己的方法。这可能吗?我通过手动投射尝试了一些调整,但我没有成功。

2 个答案:

答案 0 :(得分:4)

您需要保留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。

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

答案 1 :(得分:0)

这里的问题是,在实例化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();