令人费解的 "reference to println is ambiguous" 编译错误

Puzzling "reference to println is ambiguous" compilation error

如果我编译并运行以下class(使用Java SE 7,如果重要的话),

class Foo {

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

我得到以下输出

null

到目前为止,还不错。但是,如果我取消注释 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);
                  ^

为什么 Java 编译器在参数为 System.out.printlnnull,但如果参数是 true ? null : 42?

则不是

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

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