2017-03-06 47 views
3

我正在阅读为什么Java中的数组协方差不好(Why are arrays covariant but generics are invariant?)。如果DogAnimal的子类型,则Dog[]Animal[]的子类型。这是一个问题,因为可以这样做:Java数组协变违反Liskov替换原则吗?

Animal[] animals = new Dog[1]; 
animals[0] = new Cat(); 

这与正确实施的泛型不同。 A List<Dog>不是List<Animal>的子类型

我试图理解为什么它不好并且刚刚阅读了LSP的本质。它是否以任何方式违反LSP?似乎没有明显的违规行为。

回答

4

它以任何方式违反LSP?

是的。

似乎没有明显的违规行为。

您自己的示例是违规行为。下面的代码工作正常:

Animal[] animals = new Animal[1]; 
animals[0] = new Cat(); 

但如果现在更换Animal[]其亚型Dog[],代码不再有效(即,它会导致当它以前不例外)。因此Dog[]型号不能用于任何超级类型为Animal[]且违反LSP的地方。

为了把这个在LSP的措辞:如果我们考虑物业“new Cat()可以被指定为元素”,类型Animal[]满足此属性,但它的亚型Dog[]没有。

相关问题