2

斯卡拉代码:

class Cat[T] {
    def meow[K <: T] = ""
}

class Cat[-T] {
    def meow[K <: T] = ""
}

它们可以被编译。

但是当T是协方差时,下面的代码无法编译:

class Cat[+T] {
    def meow[K <: T] = ""
}

编译器打印:

error: covariant type T occurs in contravariant position in type  <: T of type K
       def meow[K <: T] = ""
                ^

右边的类型<:不能是协变的?为什么?

4

1 回答 1

6

那将是不健全的

Jazz <: Music, , 但与,Classical <: Music之间没有关系JazzClassical

meow[K <: T]表示 aCat[Music]可以在 、 或任何类型中喵喵JazzClassical

另一方面,Cat[Classical]喵不能Jazz

但是如果你有协变Cat[+T],那么 a Cat[Classical] <: Cat[Music],so a Cat[Classical],也是一个折衷主义者Cat[Music],应该可以喵喵叫Jazz

矛盾。

于 2014-04-29T07:57:16.033 回答