带有扩展对象的ArrayList ClassCastException

时间:2014-02-27 22:34:35

标签: java inheritance arraylist classcastexception

我不确切知道如何说出这个标题,但这是问题

我有ArrayList对象B

对象B扩展了对象A

我想将对象A的元素添加到ArrayList。我觉得我应该能够这样做,因为对象A是对象B的更简单版本(或者我应该说,对象B是对象A的子集)

但是我得到ClassCastException,在将扩展对象保持为单独对象的同时解决了这个问题。

2 个答案:

答案 0 :(得分:3)

正如Liskov substitution principle所述:

  

在计算机程序中,如果S是T的子类型,则为T类型的对象   可以用S类型的对象替换。

这意味着如果你有:

class Animal {}

class Dog extends Animal {}

这样做有意义:

Animal animal = new Dog();

但做错了:

Dog dog = new Animal();

这正是你正在做的事情。你可能想要达到的目标是:

List<Animal> list = new ArrayList<Animal>();
list.add(new Animal());
list.add(new Dog());

答案 1 :(得分:1)

如果您有ArrayList<B>,则可以添加B的任何B和子类。但是您无法添加A,因为A不是B的子类。

如果您想混合AB,请尝试ArrayList<A>。您可以在这里添加两者,因为BA的子类。使用多态时,请始终使用最常规的类作为参数声明您的通用数据。