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
,但 destination 可以是 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