2.16.1 변성이 문제인 이유
String의 인스턴스는 Any의 인스턴스이기도 하다. 따라서 다음과 같이 쓸 수 있다.
val s = "A String" val a: Any = s
Any가 String의 부모 타입이라서 이렇게 쓸 수 있다. 만약 MutableList<Any>가 MutableList<String>의 부모 타입이라면 다음과 같이 쓸 수 있다.
val ls = mutableListOf("A String") val la: MutableList<Any> = ls // <-- 컴파일 오류 la.add(42)
이 코드를 컴파일할 수 있다면 문자열 리스트에 Int를 집어넣을 수 있다. 불변 리스트를 사용할 때는 이런 일이 크게 문제가 되지 않는다. 문자열로 이뤄진 불변 리스트에 Int 타입의 원소를 추가하면 List<Any> 타입의 리스트가 새로 생기고, 원래 리스트는 변하지 않는다.
val ls = listOf("A String") val la = ls + 42 // <-- 코틀린은 `la`의 타입을 `List<Any>`로 추론함