Send(“ test”,1.0d)产生Java 8编译错误,方法调用xMethod(String,double ...)与xMethod(String,Object ...)模棱两可

问题描述 投票:1回答:1

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中的错误吗?

java overloading ambiguous
1个回答
0
投票
三点(varargs)在这里至关重要。没有它们,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级别上均“合适”。因此,这是模棱两可的。


[嘿,在尝试的过程中,我发现了一个Java错误。此代码:

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做得更好。

© www.soinside.com 2019 - 2024. All rights reserved.