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