2016-04-29 4 views
1

В соответствии с определением ковариационной:Скала - ковариационная

Q [+ B] означает, что Q может принимать любой класс, но если А представляет собой подкласс В, затем Q [А] считается подкласс Q [B].

Давайте посмотрим на следующий пример:

trait SomeA 
trait SomeB extends SomeA 
trait SomeC extends SomeB 

case class List1[+B](elements: B*) 

val a = List1[SomeA](new SomeA{},new SomeB{}) 
val b = List1[SomeB](new SomeB{},new SomeC{}) 

Все это хорошо, но я не понимаю, почему List1[SomeB] подкласс List1[SomeA], или другими словами, почему б подкласс a?

+0

Ознакомьтесь с http://stackoverflow.com/questions/663254/why-doesnt-the-example-compile-aka-how-does-co-contra-and-in-variance-w. Я читал этот вопрос и отвечал несколько раз. –

ответ

2

Настоящее, List1[SomeB] является подклассом List1[SomeA], что означает, что вы можете положить первый, где позже понадобится.

scala> case class List1[+B](elements: B*) 

scala> val a = List1[SomeA](new SomeA{},new SomeB{}) 
a: List1[SomeA] = List1(WrappedArray([email protected], [email protected])) 

scala> val b = List1[SomeB](new SomeB{},new SomeC{}) 
b: List1[SomeB] = List1(WrappedArray([email protected], [email protected])) 

scala> val c: List1[SomeA] = b 
c: List1[SomeA] = List1(WrappedArray([email protected], [email protected])) 

scala> val c: List1[SomeA] = a 
c: List1[SomeA] = List1(WrappedArray([email protected], [email protected])) 

Если бы инвариантны, что было бы невозможно, см:

scala> case class List1[B](elements: B*) 
defined class List1 

scala> val c: List1[SomeA] = b 
<console>:16: error: type mismatch; 
found : List1[SomeB] 
required: List1[SomeA] 
Note: SomeB <: SomeA, but class List1 is invariant in type B. 
You may wish to define B as +B instead. (SLS 4.5) 
     val c: List1[SomeA] = b 
          ^

scala> val c: List1[SomeA] = a 
c: List1[SomeA] = List1(WrappedArray([email protected], [email protected])) 
1

Поскольку все элементы в List1[SomeB] являются подтипом SomeA (как SomeB расширяет SomeA), вы можете просто передать List1[SomeB] где List1[SomeA] ожидается.

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