Java 8抱怨以下方法调用不明确:
reference to overloadedMethod is ambiguous
both method overloadedMethod(java.lang.String,double...) in XTest and
method overloadedMethod(java.lang.String,java.lang.Object...) in XTest match
@Test
public void testUnboxing() {
Double test = new Double(1.0);
this.overloadedMethod("Hola" , test);
this.overloadedMethod("Hola" , 1.01d);
}
private void overloadedMethod(String test, double... args){
System.out.println("Method 1");
}
private void overloadedMethod(String test, Object... args){
System.out.println("Method 2");
}
我设法编译此代码的唯一方法是在参数列表的末尾添加一个空值,这将输出方法2。
this.overloadedMethod("Hola" , 1.01d, null);
Oracle Docs中没有任何东西可以解释这种现象。我能以我无穷无尽的智慧错过任何东西吗?这可能是Java 8中的错误吗?
Object
版本将获胜。但是,对于varargs,即使您将Object...
变体“升级”为Double...
,它也是模棱两可的。 ecj表示同意,通常表明它们都遵循规范。是这样;相关部分是JLS 15.12.2.2 through JLS 15.12.2.4的所有3位。
虽然存在“严格”和“松散”的应用程序,这就是为什么在不使用varargs的情况下Object版本会获胜的原因,一旦您跳到第三级(可变Arity是JLS-ese表示“ varargs”的那些三点) ,因为没有这种分离,因此,这些方法均在15.12.2.4级别上均“合适”。因此,这是模棱两可的。
public class Test {
public static void main(String[] args) {
double d = 5.0;
test(d);
}
public void test(Double d) { System.out.println("D"); }
public void test(double d) { System.out.println("d"); }
不编译,产生错误“测试引用不明确”。此错误是双重错误。它没有突出显示此代码中的实际错误(即测试方法是实例方法,不能从静态上下文中调用它们),并且确实表明此调用是模棱两可的,而实际上不是。使测试方法静态化并编译代码;小写字母d变体获胜。正如预期的那样,ecj(eclipse的编译器)没有受到此错误的影响,并报告了正确的错误。在遵循规范时,它往往比javac做得更好。