字符串连接中有和没有大括号的可选项

时间:2017-05-23 14:07:00

标签: java string concatenation brackets

第一行的行为符合我的预期,第二行不会使用错误消息进行编译:

  

方法println(char [])对于PrintStream类型

是不明确的

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

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

2 个答案:

答案 0 :(得分:1)

后者由编译器读取如下:

setNames(data.frame(split(df$val, df$marker)), c("No", "Yes"))
  No Yes
1  1   6
2  2   7
3  3   8
4  4   9
5  5  10

因此它将System.out.println( ( ("" + string) == null ) ? null : null);组合在一起。

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

null

并且会导致相同的错误。由于可以使用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( "" (string == null ? null : null));添加到null。因此,输出也是String,因此编译器完全知道要选择哪种方法。

答案 1 :(得分:0)

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