多态性:存储对象

时间:2015-12-06 13:57:13

标签: polymorphism java-8

我正在测试多态性,我提出了以下代码:

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只能存储它的孩子,而目前它没有任何东西。

我是否忽视了这个问题的真正原因?

1 个答案:

答案 0 :(得分:3)

编译错误是因为您违反了Liskov Substitution Principle

  

它指出,在计算机程序中,如果S是T的子类型,那么   类型T的对象可以用类型S的对象替换(即,   类型S的对象可以替换类型为T)的对象而不改变   该程序的任何理想属性(正确性,任务   表演等。)。

在您的情况下,您使用的是超类型(Cat),其中需要子类型(Tiger) - 即myList.add(...)。这是不允许的。