这段丑陋的代码确实可以编译,但如果s == null
public static boolean isNullOrEmpty(String s)
{
return s != null ? s.isEmpty() : null;
}
虽然这不是(如预期的那样):
public static boolean isNullOrEmpty(String s)
{
if(s != null)
return s.isEmpty();
else
return null;
}
我知道它们都明显是错误的,但是当我在我们的源代码中找到第一段代码时,我很惊讶它确实编译了。
编辑:这是 Java 7 中 JLS 的相关部分。我猜第一个语句会适用,但粗体的语句会适用。
15.25 条件运算符?:
[...]
条件表达式的类型确定如下:
[...]
- 如果第二个和第三个操作数之一是原始类型 T,而另一个的类型是对 T 应用装箱转换(第 5.1.7 节)的结果,则条件表达式的类型是 T。
[...]
- 否则,第二个和第三个操作数分别是 S1 和 S2 类型。令 T1 为对 S1 应用装箱转换产生的类型,令 T2 为对 S2 应用装箱转换产生的类型。条件表达式的类型是将捕获转换 (§5.1.10) 应用于 lub(T1, T2) (§15.12.2.7) 的结果。