从 Java 中超类类型的 ArrayList 调用子类方法

詹姆斯

我试图了解多态性,以及通过子类和超类进行继承时的最佳实践。我有三类:物品、书籍和 DVD。Items 是超类,其中 Books 和 DVD 是扩展 Items 的子类。

起初,我尝试将 Book 和 DVD 类型的新对象存储在 Items 类型的数组列表中,效果很好。

ArrayList<Items> library = new ArrayList<Items>;
library.add(new DVD(...));
library.add(new Book(...));

当我尝试从 DVD 子类调用方法 getRuntime 时出现问题。这将返回 DVD 的运行长度。我无法将此方法移至 Items 超类,并且它不适用于一本书。

library.get(0).getRuntime();

我可以理解为什么会出错,数组列表中的对象存储的类型为 Items,并且只能访问 Items 类中的方法。因此,一种选择是强制转换为正确的子类类型:

((DVD) library.get(0)).getRuntime();

但是如果我从子类调用许多方法,我是否每次都必须强制转换?另外,像这样使用演员表被认为是不好的做法吗?

我的另一个选择是为每个子类创建两个单独的数组列表:

ArrayList<DVD> libraryDvds = new ArrayList<DVD>;
ArrayList<Books> libraryBooks = new ArrayList<Books>;

不过,这难道没有打败多态性的要点吗?此外,假设我现在想打印我所有项目的列表,我必须调用两个数组列表,而不仅仅是一个包含所有项目的列表。

感谢您的帮助,如果需要,我可以提供更详细的代码示例。

豪多

如果getRuntime真的特定于 DVD,那么演员表是唯一的出路。您将需要在每次需要时进行投射。在转换之前,好的做法是在(使用 instanceof)或 catch 之前检查类型ClassCastException

但更优雅的方法可能是使用 DVD 列表而不是项目列表。如果需要,您还可以有一个项目列表。

ArrayList<Items> library = new ArrayList<Items>; // list to use when processing the whole library
ArrayList<DVD> libraryDvds = new ArrayList<DVD>; // list to use when processing only DVDs

我认为您这样做并没有打败多态性,因为您只为 DVD 执行特定操作,因此您要实现的功能不是多态性的。

最后一个解决办法,如果你真的想用polymporphism这里将申报getRuntime()Item,写在书的执行,会做回一个实例的Runtime这什么都不做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java的:使用接口从父类调用子类中的方法

Java:从子类调用超类的受保护方法-不可见?

从Java中的子类构造函数调用超类

将通用子类型类信息传递给Java中的超类

Java多态性如何调用子类对象的超类方法

Java:在超类方法签名中返回子类

从超类调用子类方法

Java:强制子类重写超类的方法

在调用超类的构造函数之前,有什么方法可以在Java中初始化子类的成员变量?

在子类对象java上调用父类的方法

如何确保某些方法从子类(Java)中的方法从抽象超类中调用

子类java中的“重写”超类成员

java-从动态转换的超类调用子类方法

超类引用无法在Java中调用子类方法

从超类继承ArrayList属性,但在子类中为其分配不同的类型

在数组中创建Java中超类类型的子类对象

Java继承:在超类中调用子类方法

Java继承:创建子类实例时如何调用超类方法?

Java:从超类构造函数中的子类调用的方法

在Java中,“ this”在继承该方法的子类上调用的超类方法中表示什么?

Java反射:从超类继承的类中调用GetDeclaredFields()方法

有没有更简单的方法可以在Java中的子类和超类的ArrayList上调用子类的方法

Java如何从子类中调用方法

Java在超类方法中返回不带通用参数的子类

您如何在Java中从超类调用子类方法?

方法中的Java继承ArrayList类型

通过超类对象的ArrayList访问子类方法?

java泛型-如何在知道子类类型和超类的情况下调用子重载方法

Java继承问题。在超类数组中调用子类方法不会编译