2.16.2 공변성을 써야 하는 경우와 반공변성을 써야 하는 경우
코틀린에서 공변성과 반공변성을 나타내는 단어는 각각 out과 in이다. 다음과 같은 인터페이스가 있다고 하자.
interface Bag<T> { fun get(): T }
이 인터페이스에는 T 타입의 값을 반환하는 함수만 들어 있다(그리고 T 타입을 인자로 받는 함수는 존재하지 않는다). 따라서 V가 T의 상위 타입인 경우 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는 공변성적으로 타입 파라미터를 지정하라고 경고한다.