더북(TheBook)

2.16.2 공변성을 써야 하는 경우와 반공변성을 써야 하는 경우

코틀린에서 공변성과 반공변성을 나타내는 단어는 각각 outin이다. 다음과 같은 인터페이스가 있다고 하자.

interface Bag<T> {
    fun get(): T
}

이 인터페이스에는 T 타입의 값을 반환하는 함수만 들어 있다(그리고 T 타입을 인자로 받는 함수는 존재하지 않는다). 따라서 VT의 상위 타입인 경우 Bag<T>Bag(V) 참조에 대입할 수 있다고 확신할 수 있다. 하지만 out 키워드를 사용해 타입 파라미터를 공변성으로 지정해 여러분의 의도를 명확히 해야 한다.

open class MyClassParent

class MyClass: MyClassParent()

interface Bag<out T> {
    fun get(): T
}

class BagImpl : Bag<MyClass> {
    override fun get(): MyClass = MyClass()
}

val bag: Bag<MyClassParent> = BagImpl()

Note≡

타입 파라미터가 out 변성으로 쓰이는데 아무 변성을 지정하지 않으면 (인텔리J 같은) 좋은 IDE는 공변성적으로 타입 파라미터를 지정하라고 경고한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.