了解Kotlin中“ in”关键字的一种用法

时间:2019-02-26 16:31:06

标签: generics kotlin covariance

我试图了解Kotlin对泛型的理解,尤其是in和out关键字。我写了这些简单的文章来希望说明我的困惑点。

这是看起来正常的方法;

enter image description here

在这里,IDE给出了提示,表明for循环要迭代的项的类型是Shape。很好。

上述方法的另一个版本乍一看似乎不太正确(因为它是“消费者”)。但是我要做的就是阅读Shapes列表,这就是“ from”中的全部内容。

enter image description here

那是行不通的,按照规则也许是正确的,但是我无法在这里连接点。看来是安全的操作。我还可以看到Kotlin将类型降低为“任何?”这就解释了为什么这已经给了编译器错误。有人可以在这里解释潜在的类型不安全吗?

1 个答案:

答案 0 :(得分:4)

差异始终是一个很难解决的概念……

如果您使用的是“生产者”和“消费者”一词,请注意,它们指的是您与相关商品的互动,本例中为MutableList参数。

您的第一个带有参数MutableList<out Shape>的函数可以接受Shape的列表或Shape的任何子类的列表。 (out的意思大致是“或任何子类”。)

在每种情况下,如果您正在使用列表,那么从列表中拉出的所有内容将始终为Shape(如IDE所确认)。

但是,如果您想将内容放入列表中(作为生产者),则无法确定可以安全添加的内容,这取决于它是否是子类以及哪个一个。

带有MutableList<in Shape>参数的第二个函数是相反的:它可以接受Shape的列表,或者{{1的任何 superclass 的列表}}。 (Shape的意思大致是“或任何超类”。)

在每种情况下,将in(作为生产者)放入列表中始终是安全的。但是,您无法告诉您(作为消费者)从中取出 的类型:可以用Shape调用它,其中可以包含MutableList<Any?>String或其他任何内容。因此,编译器将为它提供通用类型File(如IDE所确认)。