open class A
class B: A()
fun <T> copy(src: MutableList<T>, dst: MutableList<T>) {
for (i in 0 until src.size) {
dst.add(i, src[i])
}
}
Для вышеупомянутого кода я понимаю, что copy function
ожидает, что оба типа параметров точно такого же типа . С небольшой модификацией copy(src: MutableList<T>, dst: MutableList<in T>)
обратите внимание на ключевое слово in , я говорю, что src
должно быть точно типа T
, но пункт назначения может быть type T
или любой супер тип Т .
Для вышеуказанного измененного кода я могу вызвать метод следующим образом:
fun main(args: Array<String>) {
val l1 = mutableListOf(B(), B())
val l2 = mutableListOf<A>()
copy(l1, l2)
} // main
Вышеуказанное copy(l1, l2)
не работает, если я удаляю in
из пункта назначения (понятно).
У меня вопрос, я могу вызвать функцию без ошибок , если обновить параметр функции src
, чтобы принять out
проекцию списка . например, * * одна тысяча тридцать две
fun <T> copy(src: MutableList<out /*notice out here*/ T>, dst: MutableList<T>) {
for (i in 0 until src.size) {
dst.add(i, src[i])
}
}
В этом случае я не могу понять, что происходит под капотом. Может кто-нибудь объяснить, пожалуйста?
Обратите внимание, что это только пример из книги. Я знаю, что могу использовать List
вместо неизменяемого списка в src