我不完全理解泛型中的variance是如何工作的。在下面的代码中,类如下:Any -> Mammals -> Cats
。Any
是超类型,copy function
中有一个名为from
的参数。
从我对out
和in
关键字的理解来看,out
允许引用它的任何subtype
,只能生产不能消费。in
允许引用它的任何一个supertype
,只能消耗不能产生。
然而在copytest function
中我们正在示例化函数copy
。我在from
参数中给了它一个catlist1
参数。由于参数有一个out
关键字,这是否意味着我们只能输入catlist2
的subtype
参数?
最让我困惑的是,我看到了许多相互冲突的定义,例如,在Kotlin中,我们可以在泛型类型上使用out
关键字,这意味着我们可以将此引用分配给它的任何超类型。
现在我真的很困惑,谁能指导我如何所有这些工作?最好从头开始,谢谢!
class List2<ITEM> {
val data = mutableListOf<ITEM>()
fun get(n: Int): ITEM = data[n]
fun add(item: ITEM) { data.add(item) }
}
fun <T> copy(from: List2<out T>, to: List2<T>) {
}
fun copytest() {
val catList1 = List2<Cat>()
val catList2 = List2<Cat>()
val mammalList = List2<Mammal>()
copy(catList1, mammalList)
}
字符串
1条答案
按热度按时间xzlaal3s1#
我想你可能混淆了类声明站点泛型和使用站点泛型。
类声明站点泛型
在类声明处用协变
out
定义,确实不能将泛型类型用作类中任何函数的函数参数类型。字符串
这样说是不符合逻辑的:“我将把一匹马放在一个列表中,该列表可能要求从中检索到的所有项目都必须是奶牛。”
网站泛型
这与类级别的限制无关。它只是描述了函数得到什么样的输入。这是完全合乎逻辑的说法,“我的函数对一个容器做了一些事情,我要从容器中取出一些东西”。
型
两者结合
你可能会感到困惑的是,如果你看到一个例子,结合了上述两种情况。你可以有一个类,其中
T
是声明站点类型,但类的函数有输入参数,其中T
是函数可以接受的参数定义的一部分。例如:型
这在逻辑上是有意义的,因为类泛型类型在声明位置没有变化限制。这个函数有一个袋子,它允许从里面取出物品,还有一个袋子,它允许把物品放进去。这些
in
和out
关键字使它更允许你传递什么类型的袋子给它,但它限制了你在函数中对每个包的操作。