2.16.3 사용 지점 변성과 선언 지점 변성
앞에서 본 선언 지점 변성(declaration-site variance)은 유용하기는 하지만, 이를 사용하지 못하는 경우도 많다. Bag 인터페이스가 T 타입의 값을 소비하는 동시에 생산한다면 변성을 지정할 수 없다.
interface Bag<T> { fun get(): T fun use(t: T): Boolean }
파라미터 T는 get 메서드에서는 공변성적이고 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()) // <-- 컴파일러 오류