2013-12-24 2 views
1

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 

Это понимание правильное?

+1

Ковариация ('T [+ A]'): 'A' является подтипом' B' => 'T [A]' является подтипом 'T [B]'. Контравариантность ('T [-A]'): 'A' является подтипом' B' => 'T [A]' является ** супертипом ** 'T [B]'. Так что да, я думаю, вы правильно поняли это, хотя никто не может читать в вашей голове. – senia

+0

Зачем кому-то вниз? Меня не волнуют точки, но причина в том, что мой вопрос был плохим. –

ответ

1

Вы в основном правы. Я бы просто сказать, что это так:

  • Поскольку String является подтипом AnyRef, T[String] является подтипом T[AnyRef].
  • С Integer является подтипом AnyRef, T[Integer] является подтипом T[AnyRef].

Так что я не могу сказать,

var s:T[AnyRef] = new T[String] 
val i:T[AnyRef] = new T[Integer] 
s = i 

На самом деле, нет, я не могу сказать, что третья линия.

Нельзя допускать этого, потому что это означает, что T делает что-то, что применимо только к Integer, которое теперь можно сделать для String.

Таким образом, вы используете тип, ограничивающий его решение.

+1

Вы также не можете использовать третью строку, потому что вы использовали 'val', а не' var' ... – dg123

+0

Хороший улов. Сделано редактирование. Моя мама всегда говорила мне: «Вы ничего не можете пропустить @ dg123». Благодаря! – Vidya

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