我正在测试多态性,我提出了以下代码:
public abstract class Animal {
}
public interface Hunter {
}
public class Cat extends Animal implements Hunter {
}
public class Tiger extends Cat {
public static void main(String[] args){
//n1
}
}
我放在了n1:
ArrayList<Tiger> myList = new ArrayList<>();
myList.add(new Cat());
但它无法编译:我认为这样做是因为Cat是Tiger的父母,Tiger只能存储它的孩子,而目前它没有任何东西。
我是否忽视了这个问题的真正原因?
答案 0 :(得分:3)
编译错误是因为您违反了Liskov Substitution Principle
它指出,在计算机程序中,如果S是T的子类型,那么 类型T的对象可以用类型S的对象替换(即, 类型S的对象可以替换类型为T)的对象而不改变 该程序的任何理想属性(正确性,任务 表演等。)。
在您的情况下,您使用的是超类型(Cat
),其中需要子类型(Tiger
) - 即myList.add(...)
。这是不允许的。