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

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중