Scala의 variant

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] 이다. 따라서 에러가 발생하지 않는다.

댓글 남기기