MyClass
在 Java 6 中,类似的东西MyClass<?>
被认为是平等的,但在 Java 7 中却不是。
以Java 7为例,我偶然发现了例如Hamcrest匹配器的问题,这些匹配器给出了一个实例MyClass
和一个期望匹配的匹配器MyClass<?>
,并且他们得到编译错误说
no suitable method found for assertThat(MyClass,Matcher<MyClass<?>>)
[ERROR] method Assert.<T#1>assertThat(T#1,Matcher<? super T#1>) is not applicable
[ERROR] (actual argument Matcher<MyClass<?>> cannot be converted to Matcher<? super MyClass> by method invocation conversion)
为什么改变?原始类型和具有未指定类型参数的泛型类型之间有什么区别?
建议的答案并不能真正解释我在这里的疑惑。其中一条评论说“使用未绑定的通配符(例如在方法签名中)表明所讨论的方法知道泛型并将尊重该对象的泛型类型。” 在这里,我再次觉得如果它只是一个“信号”,它不应该在编译时引起问题。
我觉得这MyClass<?>
只是MyClass
关于它包含或操作的信息,但是虽然它是<?>
,但没有附加信息,所以它们应该被认为是平等的?