【问题标题】:Sending ("test", 1.0d) yields in a Java 8 compilation error, ambiguous method call xMethod(String,double...) vs xMethod(String,Object...)发送 ("test", 1.0d) 会导致 Java 8 编译错误、不明确的方法调用 xMethod(String,double...) 与 xMethod(String,Object...)
【发布时间】:2020-01-28 00:37:39
【问题描述】:

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】:

    三点(可变参数)是这里的关键方面。没有它们,Object 版本就赢了。但是,使用可变参数时,即使您将Object... 变体“升级”为Double...,它也是模棱两可的。 ecj 同意,这通常表明它们都遵循规范。

    原来如此;相关部分是JLS 15.12.2.2 through JLS 15.12.2.4的所有3位。

    虽然有“严格”,然后是“松散”应用程序,这就是为什么 Object 版本在没有可变参数的情况下获胜的原因,一旦你潜入第三级(变量 arity 是“可变参数”的 JLS-ese,那些三点),没有这样的分离,因此,这些方法在 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 做得更好。

    【讨论】:

    • 那么,这是否意味着您将永远无法重载以 Object... o 作为参数的方法?
    • 差不多,是的。
    猜你喜欢
    • 2014-01-12
    • 2016-05-08
    • 2017-12-20
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多