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

时间:2015-09-30 12:02:12

标签: java compiler-errors overloading ambiguous

如果我编译并运行以下类(使用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,则不会?{/ p>

1 个答案:

答案 0 :(得分:8)

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

如果你致电System.println(null),有多种候选方法,而编制者无法决定采用哪种方法。