将子类存储在超类数组中,并使用子类的方法(Java)

将子类存储在超类数组中,并使用子类的方法(Java),java,inheritance,polymorphism,subclass,superclass,Java,Inheritance,Polymorphism,Subclass,Superclass,我的问题如下: 我有一个名为Product的抽象类和2+个名为Book and Magazine的子类。杂志有一个在产品或书籍中找不到的额外方法 到目前为止还不错。但我想将这些不同的产品存储在1个阵列中,如下所示: List products=new ArrayList(); 产品。添加(新书()); 产品。添加(新杂志()) 还是没问题吧?然而,在这一点上,我也想这样做(索引1是一本杂志): products.get(1.magazineMethod() 这就是一切都变得平淡的地方。我知道in

我的问题如下:

我有一个名为Product的抽象类和2+个名为Book and Magazine的子类。杂志有一个在产品或书籍中找不到的额外方法

到目前为止还不错。但我想将这些不同的产品存储在1个阵列中,如下所示:

List products=new ArrayList();
产品。添加(新书());
产品。添加(新杂志())

还是没问题吧?然而,在这一点上,我也想这样做(索引1是一本杂志):

products.get(1.magazineMethod()

这就是一切都变得平淡的地方。我知道instanceof以及它将如何解决我的问题。然而,通过谷歌搜索和查看stackoverflow,似乎在这个问题上使用instanceof是不好的。对于每个不同的产品子类,我必须添加另一个instanceof检查。我问我的老师这件事,他不能给我一个正确的答案,并告诉我,他会检查一下

我知道多态性是如何工作的,如果产品也有magazineMethod()它就会工作。但这是毫无意义的,因为一个产品不是一本杂志,这样做会破坏整个继承点


是的,这是家庭作业的一部分,但我脑海中的问题是如此的基本,以至于我希望找到正确的解决方法,而不是一些变通方法/黑客作业。

基本上,你不能。如果变量的类型为Foo,则只能在Foo或Foo的父级上使用函数

解决办法:

  • 在将刀库传递到阵列之前,还应将其存储在刀库类型的变量中,并在使用刀库功能时参考该变量

  • 在打电话之前将产品投到杂志上

  • 与magazineMethod()不同,它有一个同时适用于书籍和杂志的泛型方法,其行为由子类重写


第三个选项通常是最好的。

如果您的收藏类型为
产品
为什么要调用
magazineMethod
?@user7,因为它是杂志类属性的获取者,而杂志类属性不在产品或书籍中。