Scala in Depth представляет этот пример при совпадении.Понимание ковариации Пример
Определить класс T
с параметром совместного варианта. Со-вариант означает, что создание экземпляра T[+A]
является законным, если параметр является подтипом или равен A
.
scala> class T[+A] {}
defined class T
инстанцировать T[...]
с AnyRef
.
scala> val x = new T[AnyRef]
x: T[AnyRef] = [email protected]
Затем назначьте x
к T[Any]
. Any
является родителем AnyRef
.
В результате мы можем создать T[Any]
с T[AnyRef]
, так как AnyRef
является подтипом Any
.
scala> val y : T[Any] = x
y: T[Any] = [email protected]
Однако, мы не можем сделать то же самое с T[String]
после Any
является не суб-типа `String.
scala> val z : T[String] = x
<console>:7: error: type mismatch;
found : T[AnyRef]
required: T[String]
val z : T[String] = x
Это понимание правильное?
Ковариация ('T [+ A]'): 'A' является подтипом' B' => 'T [A]' является подтипом 'T [B]'. Контравариантность ('T [-A]'): 'A' является подтипом' B' => 'T [A]' является ** супертипом ** 'T [B]'. Так что да, я думаю, вы правильно поняли это, хотя никто не может читать в вашей голове. – senia
Зачем кому-то вниз? Меня не волнуют точки, но причина в том, что мой вопрос был плохим. –