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

问题描述 投票:0回答:1

我试图理解Kotlin对泛型的看法,特别是关注进出关键词。我写了这些简单的文章,希望能说明我的困惑。

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

enter image description here

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

上面方法的另一个版本乍一看似乎不太合适(因为它是“消费者”)。但我想要做的就是阅读形状列表,这就是“来自”的所有内容。

enter image description here

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

generics kotlin covariance
1个回答
4
投票

变化总是一个难以理解的概念......

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

你的第一个函数,带有MutableList<out Shape>参数,可以接受Shapes列表,或者Shape的任何子类列表。 (out大致是'或任何子类'。)

在每种情况下,如果您正在使用列表,那么从列表中提取的内容将始终是Shape(如IDE确认的那样)。

但是如果你想把一些东西放到列表中(作为一个生产者),你就无法分辨哪些是安全的,因为这取决于它是否是一个子类,以及哪一个。

你的第二个函数,使用MutableList<in Shape>参数,则相反:它可以接受Shapes的列表,或任何超类Shape的列表。 (in大致是'或任何超类'。)

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

© www.soinside.com 2019 - 2024. All rights reserved.