我不确切知道如何说出这个标题,但这是问题
我有ArrayList
对象B
对象B扩展了对象A
我想将对象A的元素添加到ArrayList
。我觉得我应该能够这样做,因为对象A是对象B的更简单版本(或者我应该说,对象B是对象A的子集)
但是我得到ClassCastException
,在将扩展对象保持为单独对象的同时解决了这个问题。
答案 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
的子类。
如果您想混合A
和B
,请尝试ArrayList<A>
。您可以在这里添加两者,因为B
是A
的子类。使用多态时,请始终使用最常规的类作为参数声明您的通用数据。