2014-07-22 24 views
0

我有一个抽象类C0。 我有几个其他类从C0继承。他们重写抽象方法并拥有自己的特殊方法。使用抽象类ArrayList

我想创建一个包含每一个这些专门类的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和自己的方法。这可能吗?我通过手动投射尝试了一些调整,但我没有成功。

+2

=>看看“多态性” – Mik378

+0

困难的方法是看,如果有通过反射的方法 –

回答

4

您或者需要保留一个单独的ArrayList的C1和C2实例,或者您必须将它们转换为它们各自的类型以使用子类型的方法。喜欢的东西:

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

您也可以使用的instanceof关键字来检查一个元素实际上是一个特定亚型的实例,你做的铸造前,否则你会得到一个ClassCastException。

但请注意,这有一个非常糟糕的代码气味,所以跟踪每个子类型,因为你需要他们可能是要走的路。

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();