object Variance { // to allow trait List[+T] { def isEmpty: Boolean def head: T def tail: List[T] } class Cons[T](val head: T, val tail: List[T]) extends List[T] { def isEmpty = false } // extends List[Nothing] so that it can hold anything object Nil extends List[Nothing] { def isEmpty = true def head: Nothing = throw new NoSuchElementException("Nil.head") def tail: Nothing = throw new NoSuchElementException("Nil.tail") } def run = { println("Variance") val x: List[String] = Nil } }