java - 使用抽象类的ArrayList

标签 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自己的方法。这可能吗?我尝试通过手动转换进行一些调整,但没有成功。

最佳答案

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

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

关于java - 使用抽象类的ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891390/

相关文章:

c# - Nullable<T> 作为参数

c# - 单元测试 : How to test generic repository

Java 集合排序 BigDecimal

java - 如何从 Java/Android 的 Arraylist 中保留最好的 500 个关键点?

android - 如何将 <Spanned> 放入 list.setAdapter?

java - 连接 Mongo 时出现身份验证错误

java - java JDK 从 Oracle 更改为 Amazon Corretto 后 Pentaho 服务器登录问题

java - 我正在自动化一个网页,点击链接需要一些时间来加载页面。尝试了隐式和显式等待,它不起作用。还有其他建议吗?

java - 我应该如何读取带有编号对象的 JSON?

ios - 具有关联类型的协议(protocol)。如何避免在协议(protocol)的所有实现上手动分配类型