为什么Java泛型中需要使用通配符?

时间:2014-07-07 12:02:50

标签: java generics wildcard

如果我做对了,Java通配符的唯一目的是引入泛型类型之间的协方差和逆变。我将Java通配符视为实现这两个概念的编译器技巧。我是对的还是还有更多呢?

2 个答案:

答案 0 :(得分:2)

在大多数情况下,这是正确的,但它并不是真正的编译器技巧" - 更多的语言功能,以保证在编译时(除了未经检查的强制转换/警告),你永远不会在运行时以类型不一致的状态结束。

编译器可以很容易编写,盲目地接受这样的协变通用代码而没有通配符就好 - 但你不能保证你不会遇到{{1稍后就行了。(或者几个)。

答案 1 :(得分:2)

是的,你基本上是对的。但我不会把它称为编译器技巧(毕竟,Java 泛型是一个很大的编译器技巧,没有别的。)

通配符是一种声音类型系统概念;它们保证您编写的编译代码并且不使用强制转换的代码将在运行时成功。因此,通配符不是一招;它们是表达使用网站差异的完美有效方式。

批评的唯一要点是通配符不允许声明网站差异,例如,C#允许。