了解 Kotlin 中 "in" 关键字的一种用法
Understanding one usage of "in" keyword in Kotlin
我正在尝试了解 Kotlin 对泛型的理解,尤其是 in
和 out
关键字。我写了这篇简单的文章,希望能说明我的困惑。
这是看起来和工作正常的方法;
这里,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?>
调用,它可以包含 String
s 或 File
s 或其他。所以编译器会给它通用类型,Any?
(正如 IDE 确认的那样)。
我正在尝试了解 Kotlin 对泛型的理解,尤其是 in
和 out
关键字。我写了这篇简单的文章,希望能说明我的困惑。
这是看起来和工作正常的方法;
这里,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?>
调用,它可以包含 String
s 或 File
s 或其他。所以编译器会给它通用类型,Any?
(正如 IDE 确认的那样)。