2.16.3 사용 지점 변성과 선언 지점 변성

    앞에서 본 선언 지점 변성(declaration-site variance)은 유용하기는 하지만, 이를 사용하지 못하는 경우도 많다. Bag 인터페이스가 T 타입의 값을 소비하는 동시에 생산한다면 변성을 지정할 수 없다.

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

    파라미터 Tget 메서드에서는 공변성적이고 use 메서드에서는 반공변성적이기 때문에 변성을 지정할 수 없다. 이런 경우 선언 지점 변성을 사용할 수는 없다. 하지만 이럴 때도 여전히 사용 지점 변성(use-site variance)을 사용할 수 있다. 다음 useBag 함수를 살펴보자.

    open class MyClassParent
    
    class MyClass: MyClassParent()
    
    interface Bag<T> {
        fun get(): T
        fun use(t: T): Boolean
    }
    
    class BagImpl : Bag<MyClassParent> {
        override fun get(): MyClassParent = MyClassParent()
        override fun use(t: MyClassParent): Boolean = true
    }
    
    fun useBag(bag: Bag<MyClass>): Boolean {
        // bag으로 작업 수행
        return true
    }
    
    val bag3 = useBag(BagImpl()) // <-- 컴파일러 오류
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.