Scala의 variant는 낯설고도 헷갈리기 쉬운 개념이다.
개념 정의
A <: B
일때 C[A] <: C[B]
라면, C는 covariant다.
A <: B
일때 C[A] >: C[B]
라면, C는 contravariant다.
역도 성립한다.
C가 covariant라면, A <: B
일때 C[A] <: C[B]
이다.
C가 contravariant라면, A <: B
일때 C[A] >: C[B]
이다.
선언하는 법
C를 covariant로 선언하려면,
class C[+A] { ... }
C를 contravariant로 선언하려면,
class C[-A] { ... }
예
아래 코드의 두번째줄에서 타입 에러가 발생하지 않으려면,
object Nil extends List[Nothing] { ... }
val x : List[String] = Nil
List는 아래와 같이 covariant로 선언되어야 한다.
class List[+T] { ... }
이렇게 하면 List
가 covariant이므로, String >: Nothing
일때 List[String] >: List[Nothing]
이다. 따라서 에러가 발생하지 않는다.