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

Understanding one usage of "in" keyword in Kotlin

我正在尝试了解 Kotlin 对泛型的理解,尤其是 inout 关键字。我写了这篇简单的文章,希望能说明我的困惑。

这是看起来和工作正常的方法;

这里,IDE 给出了一个提示,说明 for 循环迭代的项目类型是 Shape。这个不错。

上述方法的另一个版本乍一看似乎不太正确(因为它是一个“消费者”)。但我想做的就是阅读形状列表,这就是 from.

中的全部内容

这行不通,根据规则可能是正确的,但我无法将这里的点联系起来。这似乎是一个安全的操作。我还可以看到 Kotlin 将类型改为“Any?”这解释了为什么这已经给出了编译器错误。有人可以在这里解释潜在的类型不安全吗?

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

如果您使用术语“生产者”和“消费者”,请注意它们指的是您与相关项目的互动,在本例中是 MutableList 参数。

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

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

但是如果您想将某些内容 放入 列表中(作为制作人),您无法判断添加什么是安全的,因为这取决于它是否一个子类,哪个子类。

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

在每种情况下,将 Shape 放入列表(作为生产者)总是安全的。但是你不能说出你从它 out 中提取的东西的类型(作为消费者):它可以用 MutableList<Any?> 调用,它可以包含 Strings 或 Files 或其他。所以编译器会给它通用类型,Any?(正如 IDE 确认的那样)。