字符串连接中带和不带大括号的可选
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
组合在一起。
所以这意味着,无论条件的结果如何,都会返回 null
或 null
。现在 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>);
所以在这里你 添加 null
到 String
。结果,输出也是 String
,因此编译器完全知道选择什么方法。
+
运算符的优先级高于 ==
,因此在没有括号的情况下,首先计算 ("" + string)
,然后进行条件检查。
System.out.println
方法被重载。在重载的情况下,编译器会选择参数可以分配给的最接近的参数类型。但是在这里,可以将 null 分配给所有重载的 println 方法,如@Willem 的回答中所述,因此混淆了编译器并导致编译错误。
第一行如我所料,第二行没有编译错误信息:
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
组合在一起。
所以这意味着,无论条件的结果如何,都会返回 null
或 null
。现在 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>);
所以在这里你 添加 null
到 String
。结果,输出也是 String
,因此编译器完全知道选择什么方法。
+
运算符的优先级高于 ==
,因此在没有括号的情况下,首先计算 ("" + string)
,然后进行条件检查。
System.out.println
方法被重载。在重载的情况下,编译器会选择参数可以分配给的最接近的参数类型。但是在这里,可以将 null 分配给所有重载的 println 方法,如@Willem 的回答中所述,因此混淆了编译器并导致编译错误。