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는 공변성적으로 타입 파라미터를 지정하라고 경고한다.

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