gpt4 book ai didi

java - Kotlin 投影冗余

转载 作者:搜寻专家 更新时间:2023-11-01 02:00:49 24 4
gpt4 key购买 nike

在阅读有关 Kotlin 泛型类型差异和投影的内容时,我想到了一个对我来说完全陌生的概念。有人可以解释一下作者想要解释的想法是什么吗?请引用Kotlin in Action, MEAP:

There is no sense to get an out projection of a type parameter that already has out variance, such as List<out T>. That would mean the same as List<T>, because List is declared as class List<out T>. The Kotlin compiler will warn that such a projection is redundant.

这里有两个具体的问题:

  1. 为什么您需要在已经投影的类型列表上添加投影?
  2. 即使这样做,如何获得相同的列表?

最佳答案

如前所述,这将是“多余的”,因此您永远不想这样做。它根本不会增加任何好处。整个引用与use-site variance相关,即由客户指定的方差(对应于Java中的通配符)。类(class)List<out T>已经有一个declaration-site variance修饰符out , 这使得 out 的使用现场应用多余的。

这是一个冗余客户端方差的例子:

fun <T> useList(list: List<out T>) {
println("first element: ${list[0]}")
}

我应用了 out List<T> 类型的函数参数的修饰符,这是使用地点差异的一个例子。编译器注意到它是多余的:"Projection is redundant" .它既不会使情况变得更糟也不会变得更好。

另一方面,如果您使用的是尚未投影到声明站点 的类型,这确实有意义。例如,Array类别不受方差限制:public class Array<T> .

重写前面的示例以使用 Array , 添加 out 突然变得有意义了修饰符,因为该参数仅用作 T 的生产者,即不在 in 中位置。

有意义的客户端方差示例:

fun <T> useArray(arr: Array<out T>) {
println("first element: ${arr[0]}")
}

经验法则

根据经验,对应Java的 PECS (生产者 extends ,消费者 super ),你可以记住 Kotlin 的 POCI(生产者 out ,消费者 in )。

关于java - Kotlin 投影冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com