【发布时间】:2013-04-12 04:54:01
【问题描述】:
Liskov 替换原则告诉我们,如果 A 是 B 的子类型,那么我们可以用类型 B 做的所有事情都应该能够用类型 A 做。
因此,为了进一步调查,我创建了以下内容:
class Animal
class Dog extends Animal
class BlueDog extends Dog
我明白为什么我不允许这样做
val c: Array[Animal] = a
因为数组在 Scala 中不是协变的(就像在 Java 中一样)。
但是,我想我应该可以做到:
val a: Array[Dog] = Array(new Dog())
val b: Array[BlueDog] = a
我希望 val b 没问题。 但我明白了:
class Array is invariant in type T. You may wish to investigate a wildcard type such as `_ >: ...
【问题讨论】:
-
顺便问一下,为什么你认为
val b: Array[BlueDog] = a是健全的?即使数组不是一成不变的,您也将最不具体的分配给最具体的。如果您从 b 中获取元素并调用仅在 BlueDog 上定义的方法,您期望发生什么?