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()) // <-- 컴파일러 오류