gpt4 book ai didi

java - 对方法的引用是模棱两可的,具有泛型,奇怪的行为

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:07 25 4
gpt4 key购买 nike

<分区>

考虑以下场景:

class C {
void m(Class<?> c1, Class<?> c2) {}
<S, U extends S> void m(S s, U u) {}
}

class x {{
final Class<Integer> cInteger = Integer.class;
final Class<?> cSomething = null;
final C c = new C();
c.m(cInteger, cInteger);
c.m(cSomething, cSomething); // *
}}

使用 Oracle 的 javac,版本 1.7.0_01(以及 1.7.0,以及 OpenJDK 的 Java 7 和 Java 6 编译器),我在标有 // * 的行上遇到错误:

error: reference to m is ambiguous, both method m(Class,Class) in C and method m(S,U) in C match

我不明白为什么会这样:当参数的静态类型为 Class<Integer> 时,编译器能够判断正在调用哪个方法。 , 但它有问题 Class<?> .

IntelliJ 的代码分析表明这是可以的,JRockit 的(或者是 Sun 的 Java 6)编译器也是如此。

所以,这里显然存在错误,要么在那些说它是正确的软件中,要么在那些说它错误的软件中。

请注意,如果我删除 U 的界限(也就是说,如果我将 m 声明为 <S, U> void M(S s, U u) {},它将编译而不会出错。此外,使用原始类型(即 Class x = null; m(x, x))的调用也可以正常编译。

那么,根据Java规范,这段代码是有效的还是无效的?

谢谢。

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