Позвольте мне продемонстрировать, что происходит с помощью примера. Учтите следующее:
private fun foo(list: ArrayList<Number>) {}
private fun bar(list: ArrayList<Number>) {}
Теперь мы попытаемся передать ArrayList
каждой функции, каждая с различным параметром универсального типа:
// Error: Type Mismatch. Required `ArrayList<Number>` Found `ArrayList<Int>`
foo(arrayListOf<Int>())
// Error: Type Mismatch. Required `ArrayList<Number>` Found `ArrayList<Any>`
bar(arrayListOf<Any>())
Но мы получаем ошибки! Как мы решаем это? Мы должны как-то сообщить компилятору, что для foo
список также может содержать элементы подтипа Number
(например, Int
), а для bar
мы должны сообщить компилятору, что список также может содержать элементы базового типа Number
(например, Any
).
private fun foo(list: ArrayList<out Number>) {}
private fun bar(list: ArrayList<in Number>) {}
И теперь это работает!
Дополнительная литература