0

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 `_ >: ...
4

1 回答 1

1
val a: Array[Dog] = Array(new Dog())
val b: Array[BlueDog] = a

有点奇怪,因为您的 BlueDog 比 Dog 更严格,并且可能有其他方法。

class Animal
class Dog extends Animal
class BlueDog extends Dog {
  def wolf() { println ("I'm a blue dog") }
}

那么下面的代码应该怎么做呢?

val a: Array[Dog] = new Array(new Dog())
val b: Array[BlueDog] = a
b(0).wolf()

好吧,您的 Dog in Arraya没有wolf()方法....所以很明显,您不应该将父类型分配给子类型。

这就是为什么以下工作:

val dog: Dog = new BlueDog

但以下没有:

val blueDog: BlueDog = new Dog
于 2013-04-19T00:07:03.733 回答