【问题标题】:Does Java array covariance violate Liskov Substitution Principle?Java数组协方差是否违反里氏替换原则?
【发布时间】:2017-07-26 23:49:10
【问题描述】:

我正在阅读为什么 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?似乎没有明显的违规行为。

【问题讨论】:

    标签: generics covariance language-design solid-principles liskov-substitution-principle


    【解决方案1】:

    它是否以任何方式违反了 LSP?

    是的。

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

    你自己的例子是违规的。以下代码工作正常:

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

    但是,如果现在将 Animal[] 替换为其子类型 Dog[],代码将不再有效(也就是说,它会导致以前没有的异常)。所以 Dog[] 类型不能在任何可以使用其超类型 Animal[] 的地方使用,这违反了 LSP。

    用 LSP 的话来说:如果我们考虑属性“new Cat() 可以被分配为一个元素”,则类型 Animal[] 满足此属性,但其子类型 Dog[] 不满足。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 2017-05-14
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      相关资源
      最近更新 更多