令人费解的 "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.println
是 null
,但如果参数是 true ? null : 42
?
则不是
表达式 true ? null : 42
的类型是 Integer
因此应该调用 System.println(Object)
是明确的。
如果调用 System.println(null)
有多个候选方法,编译器无法决定采用哪一个。
如果我编译并运行以下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.println
是 null
,但如果参数是 true ? null : 42
?
表达式 true ? null : 42
的类型是 Integer
因此应该调用 System.println(Object)
是明确的。
如果调用 System.println(null)
有多个候选方法,编译器无法决定采用哪一个。