令人费解的"对println的引用是模棱两可的"编译错误

jub*_*0bs 2 java overloading compiler-errors ambiguous

如果我编译并运行以下类(使用Java SE 7,如果这很重要),

class Foo {

    public static void main(String[] args) {
        System.out.println(true ? null : 42);
        // System.out.println(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

null
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,如果我取消注释第二个语句main,我会收到编译错误:

Foo.java:5: error: reference to println is ambiguous, both method println(char[]) in PrintStream and method println(String) in PrintStream match

      System.out.println(null);
                  ^
Run Code Online (Sandbox Code Playgroud)

如果参数System.out.printlnnull,那么为什么Java编译器会抛出此错误 ,但如果参数是true ? null : 42

wer*_*ero 8

类型表达的true ? null : 42Integer因此它是明确的是System.println(Object)应该被调用.

如果你调用System.println(null)有多个候选方法,编译器无法决定采用哪种方法.

  • 类型是'整数'确切地说...... (4认同)