Koltingenerics声明 – 站点方差构造

我正在阅读kotlin没有通配符的原因( https://kotlinlang.org/docs/reference/generics.htm l)。 这一切都来到声明网站的变化。 我们有结构应该取代通配符。 我想我明白了是如何运作的,但我却在遇到麻烦。
所以在java中,我们可以这样写:

 public List list1; public List list2; 

初始化后的第一种情况变成只读列表(虽然不是完全不可改变的原因,我们可以清除它),如果我们把每个元素都视为数字,就可以读取它们。
第二种情况是只写(尽管我们可以阅读它,如果我们把每个元素作为对象)。 我们可以写那里字符串和它的子类。
在Kotlin中,我能够像这样使用重新创建list1示例:

 class Service { val container = Container(mutableListOf("1", "2", "3")) } class Container(var list1: MutableList) 

最后我尝试了一些类似于东西,认为我可以重新创建list2的例子,但是我失败了: 在这里输入图像说明

有人可以向我解释如何在Kotlin中实现我的list2例子吗? 我应该如何正确使用结构?

Kotlin List不等于Java List 。 Java列表具有变异function,而Kotlin列表是只读的。 它是Kotlin MutableList ,等同于Java列表。

接下来,看一下List声明 :它的types参数是协变的( out E ),并且声明站点的variables不能被使用站点variables覆盖,这就是为什么你不能在List有一个List

此外,声明站点方差out E意味着E永远不会出现在一个in -position(没有Etypes的函数参数,也不是Etypes的可变属性),事实上,由于List是只读的,不会将E带入其任何function(*)

你可以转换你的例子来使用MutableList来代替:

 class Container2(var list2: MutableList) 

MutableList接口具有E不变性,而use-site中的MutableList不与声明网站方差冲突。

(*)实际上, 它只是使用标有@UnsafeVariance注解的参数,它简单地抑制了方差冲突,更多关于它的信息可以在这里find。


另外,一个小的评论:

这一切都来到声明网站的变化。 我们有结构应该取代通配符。

这实际上是用于替换Java通配符的使用站点差异。 声明站点的差异只适用于types参数声明(types被定义的地方),当它是时,types的所有用法都会有差异(例如当你使用List ,它实际上是一个List因为List的声明站点变化)。 因此,使用地点差异对于通用types的特定用途而言。