2014-04-29 2 views
2

код Scala:Почему T в «K <: T» не может быть ковариацией?

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] = "" 
       ^

Тип на праве <: не должно быть КОВАРИАНТНОЙ? И почему?

+0

'T in" K <: T "не может быть ковариацией', доступной только в отрицательных положениях. – Freewind

ответ

6

Это было бы несостоятельным

с Jazz <: Music, Classical <: Music, но не имеет никакого отношения между Jazz и Classical,

meow[K <: T] означает, что Cat[Music] может мяукать в Jazz, Classical или любом выборе жанра.

С другой стороны, Cat[Classical] мяу не может быть Jazz.

Но если вы ковариантны Cat[+T], то Cat[Classical] <: Cat[Music], поэтому Cat[Classical], будучи эклектичный Cat[Music] тоже должен быть в состоянии мяу Jazz.

Противоречие.

Смежные вопросы