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

为什么Java泛型中需要通配符?,java,generics,wildcard,Java,Generics,Wildcard,如果我没有弄错的话,Java通配符的唯一目的就是在泛型类型之间引入协方差和逆变。我将Java通配符视为实现这两个概念的编译器技巧。我说得对吗?或者还有更多吗?在很大程度上是对的,但这并不是真正的“编译器技巧”——更重要的是,这是一种语言功能,可以在编译时保证(不检查强制类型/警告除外)您永远不会在运行时处于类型不一致的状态 编译器可以很容易地被编写成盲目地接受这种没有通配符的协变泛型代码,但你不能保证以后不会遇到ClassCastException(或几个)。在大多数情况下,这是对的,但这并不是

如果我没有弄错的话,Java通配符的唯一目的就是在泛型类型之间引入协方差和逆变。我将Java通配符视为实现这两个概念的编译器技巧。我说得对吗?或者还有更多吗?

在很大程度上是对的,但这并不是真正的“编译器技巧”——更重要的是,这是一种语言功能,可以在编译时保证(不检查强制类型/警告除外)您永远不会在运行时处于类型不一致的状态


编译器可以很容易地被编写成盲目地接受这种没有通配符的协变泛型代码,但你不能保证以后不会遇到
ClassCastException
(或几个)。

在大多数情况下,这是对的,但这并不是真正的“编译器技巧”-更重要的是,这是一种语言功能,可以在编译时保证(不检查强制类型转换/警告),您永远不会在运行时处于类型不一致的状态


编译器本来可以很容易地编写成盲目接受这种没有通配符的协变泛型代码,但你不能保证以后不会遇到
ClassCastException
(或几个)。

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

通配符是一种声音类型的系统概念;它们保证您编写的代码能够在运行时成功编译而不使用强制转换。因此,通配符不是一个技巧;它们是表达使用地点差异的一种非常有效的方法


唯一的批评是,通配符不允许声明站点变化,例如C#允许。是的,你基本上是对的。但我不认为这是一个编译器技巧(毕竟,Java泛型是一个大的编译器技巧,没有别的)

通配符是一种声音类型的系统概念;它们保证您编写的代码能够在运行时成功编译而不使用强制转换。因此,通配符不是一个技巧;它们是表达使用地点差异的一种非常有效的方法


唯一的批评是,通配符不允许声明站点变化,例如C#允许。

另一件让我有点困惑的事情是如何正确读取通配符。例如,我读到这个@Kami:嗯,你可以这样称呼它。然而,仅仅使用通配符是没有意义的。与其把它作为一个整体来阅读,还不如把它作为一个整体来阅读,例如:
x另一件让我有点困惑的事情是如何正确地阅读通配符。例如,我读到这个@Kami:嗯,你可以这样称呼它。然而,仅仅使用通配符是没有意义的。而是把它作为一个整体来阅读,例如:
X