Java 使用抽象类的ArrayList

Java 使用抽象类的ArrayList,java,generics,arraylist,casting,Java,Generics,Arraylist,Casting,我有一个抽象类C0。 我还有几个从C0继承的类。它们覆盖了抽象方法,并有自己的特殊方法 我想创建一个ArrayList,其中包含所有这些专用类 下面是一段代码,显示了我(想要)如何做: ArrayList A=新的ArrayList(); A.添加(新C1()); A.添加(新C2()); A.get(x)因为我的类扩展了C0。 A.get(0)不起作用 A.get(1).方法C2();//不起作用 我希望能够通过这个ArrayList调用C1和C2自己的方法。那可能吗?我通过手动强制转换尝试

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

我想创建一个ArrayList,其中包含所有这些专用类

下面是一段代码,显示了我(想要)如何做:

ArrayList A=新的ArrayList();
A.添加(新C1());
A.添加(新C2());
A.get(x)因为我的类扩展了C0。
A.get(0)不起作用
A.get(1).方法C2();//不起作用

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

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


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

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


但是请注意,这有一种非常糟糕的代码味道,因此根据需要跟踪每个子类型可能是一种方法。

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

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

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

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

=>看看“多态性”难的是看,如果有通过反射的方法=>看看“多态性”难的是看,如果有通过反射的方法