gpt4 book ai didi

java - SomeClass 和 SomeClass 的区别

转载 作者:行者123 更新时间:2023-11-30 06:24:41 27 4
gpt4 key购买 nike

在 Java 6 中类似于 MyClassMyClass<?>被认为是相等的,但在 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)

为什么要改变?原始类型和具有未指定类型参数的泛型类型之间有什么区别?

建议的答案并没有真正解释我在这里想知道的事情。其中一条评论说“使用未绑定(bind)的通配符(例如,在方法签名中)表示一个 promise ,即所讨论的方法知道泛型并将尊重该对象的泛型类型。”在这里,我再次觉得,如果它只是一个“信号”,它应该不会在编译时引起问题。

我觉得MyClass<?>只是MyClass包含有关它包含或操作的内容的信息,但它是 <?> ,没有附加信息,所以它们应该被认为是相等的?

最佳答案

这似乎与一个compiler bug有关这是在 Java 7 中修复的。

您现在收到的编译器错误是正确的。看起来您正在使用通配泛型类型调用该方法,例如MyClass<?>Matcher<MyClass<?>> .请注意,通配符类型参数表示“某种未知类型”,因此这些参数实际上可能是 MyClass<String>Matcher<MyClass<Integer>> ,这显然是不正确的。

使用原始类型,例如普通 MyClass 选择退出通用类型检查,这就是为什么使用原始类型的调用可以编译(但可能在运行时失败并返回 ClassCastException)。

关于java - SomeClass 和 SomeClass<?> 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16579891/

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