title: Scala - Covariance
body: <p>According to covariance definition: </p>
  
  <blockquote>
    <p>Q[+B] means that Q can take any class, but if A is a subclass of B,
    then Q[A] is considered to be a subclass of Q[B].</p>
  </blockquote>
  
  <p>Let's see the following example:</p>
  
  <pre><code>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{})
  </code></pre>
  
  <p>Everything is fine, but I don't see why <code>List1[SomeB]</code> is a subclass of <code>List1[SomeA]</code>, or in other words why b is a subclass of <code>a</code>?</p>