- Invariant(불공변성) : 타입 간 관련성이 없음
class Cup<T>
val anys: Cup<Any> = Cup<Int>() // 오류
val nothings: Cup<Nothing> = Cup<Int>() // 오류
- Convariant(공변성) :
T
타입이 서브타입인 경우 서브타입에 해당
class Cup<out T>
val anys: Cup<Any> = Cup<Int>() // OK
val nothings: Cup<Nothing> = Cup<Int>() // 오류
- Contravariant(반공변성) :
T
타입이 서브타입인 경우 슈퍼타입에 해당
class Cup<in T>
val anys: Cup<Any> = Cup<Int>() // 오류
val nothings: Cup<Nothing> = Cup<Int>() // OK