더북(TheBook)

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()) // <-- 컴파일러 오류
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.