3 回答
TA贡献1824条经验 获得超5个赞
这不会编译,因为我们不能将空值分配给原始类型的变量
boolean e = null;
这也没有编译,虽然有判断,但是编译器检测到该值始终为null并且与前面的情况相同
boolean f = c ? null : null;
在这种情况下,由于编译器不知道 b 的最终值,因此代码可以编译,但由于最终值为 null 而无法运行
boolean c = true;
boolean d = true;
boolean b = c ? null : d;
TA贡献1963条经验 获得超6个赞
三元表达式中的类型必须是相同的 type,所以我猜JLS 说在这种情况下这些类型是自动装箱的(它会变成Boolean);考虑到检查/优化javac做的很少,这里没有做。有趣的是,intellij 确实会抱怨,例如会抛出一个潜力 NullPointerException。
对我来说,这在某种程度上属于同一类别:
String s = null;
if (true == true) {
}
if(s == null) {
}
等等......它们在编译时对我们来说都是已知的,但对于编译器来说却不是。
有点不相关,但三元运算符远非if statement,Holger 曾经向我展示了这个很棒的促销示例:
boolean b = true;
Object result = b ? Integer.valueOf(42) : Long.valueOf(12);
System.out.println(result.getClass() + " " + result); // class java.lang.Long 42
添加回答
举报