第一行的行为符合我的预期,第二行不会使用错误消息进行编译:
方法println(char [])对于PrintStream类型
是不明确的
我不明白,我认为带有可选项的括号只是为了便于阅读。
System.out.println("" + (string == null ? null : null));
System.out.println("" + string == null ? null : null);
答案 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);
组合在一起。
因此,这意味着,无论条件的结果如何,都会返回"" + string
或null
。现在null
没有专用类型:任何类型的对象都可以是null
。所以Java不知道要为此调用什么方法。你可以写:
null
并且会导致相同的错误。由于可以使用System.out.println(null);
:
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方法,因此会混淆编译器并导致编译错误。