fun <T> addAll(list1: MutableList<T>, list2: MutableList<out T>) { // <-- T를 공변성으로 만듦 for (elem in list2) list1.add(elem) } val ls = mutableListOf("A String") val la: MutableList<Any> = mutableListOf() addAll(la, ls) // <-- 오류가 발생하지 않음
여기서 out 키워드는 list2 파라미터가 T 타입에 대해 공변성적임을 표시한다. 따라서 반공변성은 in이라는 키워드로 표시할 수 있음을 추측할 수 있다. 그러므로 이 문제를 푸는 다른 해법은 list1을 in 타입(소비하지만 생산하지는 않음)으로 만드는 것이다.