【发布时间】:2019-04-08 15:55:14
【问题描述】:
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 或任何超类型的 T。
对于上述修改后的代码,我可以调用如下方法,
fun main(args: Array<String>) {
val l1 = mutableListOf(B(), B())
val l2 = mutableListOf<A>()
copy(l1, l2)
} // main
如果我从目的地删除 in,上述 copy(l1, l2) 将不起作用(了解)。
我的问题是,如果更新函数参数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 中的不可变列表
【问题讨论】:
标签: generics kotlin covariance contravariance generic-variance