gpt4 book ai didi

generics - Java 数组协方差是否违反 Liskov 替换原则?

转载 作者:行者123 更新时间:2023-12-03 16:15:14 25 4
gpt4 key购买 nike

我正在阅读为什么 Java 中的数组协方差很糟糕( Why are arrays covariant but generics are invariant? )。如果 DogAnimal 的子类型,然后是 Dog[]Animal[] 的子类型.这是一个问题,因为可以这样做:

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

这与“正确”实现的泛型不同。一个 List<Dog>不是 List<Animal> 的子类型

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

最佳答案

Did it violate the LSP in any way?


是的。

There doesn't seem to be a clear violation.


你自己的例子是违规的。以下代码工作正常:
Animal[] animals = new Animal[1];
animals[0] = new Cat();
但是如果现在更换 Animal[]及其亚型 Dog[] ,代码不再有效(也就是说,它会导致以前没有的异常)。所以类型 Dog[]不能在其父类(super class)型的任何地方使用 Animal[]可以使用并且违反了 LSP。
把这个放在 LSP 的措辞中:如果我们考虑属性“ new Cat() 可以作为一个元素分配”,类型 Animal[]满足此属性,但其子类型 Dog[]才不是。

关于generics - Java 数组协方差是否违反 Liskov 替换原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42636969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com