我试图理解Kotlin对泛型的看法,特别是关注进出关键词。我写了这些简单的文章,希望能说明我的困惑。
这是看起来和工作正常的方法;
这里,IDE给出了一个提示,说for循环迭代的项的类型是Shape。这很好。
上面方法的另一个版本乍一看似乎不太合适(因为它是“消费者”)。但我想要做的就是阅读形状列表,这就是“来自”的所有内容。
根据规则,这可能是正确的,但我无法在这里连接点。这似乎是一个安全的操作。我还可以看到Kotlin将这种类型缩小为“Any?”这解释了为什么这给出了编译器错误。有人可以解释这里潜在的类型不安全吗?
变化总是一个难以理解的概念......
如果您使用的是“生产者”和“消费者”这两个术语,请注意它们是指您与相关项目的交互,在本例中是MutableList
参数。
你的第一个函数,带有MutableList<out Shape>
参数,可以接受Shape
s列表,或者Shape
的任何子类列表。 (out
大致是'或任何子类'。)
在每种情况下,如果您正在使用列表,那么从列表中提取的内容将始终是Shape
(如IDE确认的那样)。
但是如果你想把一些东西放到列表中(作为一个生产者),你就无法分辨哪些是安全的,因为这取决于它是否是一个子类,以及哪一个。
你的第二个函数,使用MutableList<in Shape>
参数,则相反:它可以接受Shape
s的列表,或任何超类Shape
的列表。 (in
大致是'或任何超类'。)
在每种情况下,将Shape
放入列表(作为生产者)总是安全的。但是你不能告诉你从中取出它的类型(作为消费者):它可以用MutableList<Any?>
调用,它可能包含String
s或File
s或其他什么。所以编译器会给它通用类型Any?
(如IDE确认)。