字符串连接中带和不带大括号的可选

Optional with and without braces in String concatenation

第一行如我所料,第二行没有编译错误信息:

The method println(char[]) is ambiguous for the type PrintStream

我不明白,我认为可选的括号只是为了便于阅读。

System.out.println("" + (string == null ? null : null));
System.out.println("" + string == null ? null : null);

后者被编译器读取如下:

System.out.println( ( <b>("" + string)</b> == null ) ? null : null);

因此它已将 "" + string 组合在一起。

所以这意味着,无论条件的结果如何,都会返回 nullnull。现在 null 没有专用类型:任何类型的对象都可以是 null。所以 Java 不知道要调用什么方法。你可以这样写:

System.out.println(null);

它会导致 相同的 错误。因为有 a lot of methods 可以用 null:

调用
public void print(char[] s)
public void print(String s)
public void print(Object obj)

对于第一个代码片段,不是这种情况,因为编译器将其解释为:

System.out.println( "" <b>(string == null ? null : null)</b>);

所以在这里你 添加 nullString。结果,输出也是 String,因此编译器完全知道选择什么方法。

+ 运算符的优先级高于 ==,因此在没有括号的情况下,首先计算 ("" + string),然后进行条件检查。 System.out.println 方法被重载。在重载的情况下,编译器会选择参数可以分配给的最接近的参数类型。但是在这里,可以将 null 分配给所有重载的 println 方法,如@Willem 的回答中所述,因此混淆了编译器并导致编译错误。