我试图了解Kotlin对泛型的理解,尤其是in和out关键字。我写了这些简单的文章来希望说明我的困惑点。
这是看起来正常的方法;
在这里,IDE给出了提示,表明for循环要迭代的项的类型是Shape。很好。
上述方法的另一个版本乍一看似乎不太正确(因为它是“消费者”)。但是我要做的就是阅读Shapes列表,这就是“ from”中的全部内容。
那是行不通的,按照规则也许是正确的,但是我无法在这里连接点。看来是安全的操作。我还可以看到Kotlin将类型降低为“任何?”这就解释了为什么这已经给了编译器错误。有人可以在这里解释潜在的类型不安全吗?
答案 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所确认)。