以下(逻辑上)是编译时错误:
public int myMethod(MyObject input) {
if (input == null) {
return null; // compiler says I cannot return null for primitive type
} else {
return 1;
}
}
到目前为止一切顺利。我不明白,以下是允许的:
public int myMethod(MyObject input) {
return input == null ? null : 1;
}
为什么呢?认识到这对编译器应该是直截了当的,还是我在这里错过了一些关键点?
(当然,如果在三元运算符中最终得到“空分支”,那么它是NPE,还有什么?:))
答案 0 :(得分:2)
三元条件运算符的类型由其第二和第三个操作数的类型决定。
在
的情况下input == null ? null : 1
类型为Integer
,可以同时分配null
和1
。
编译器允许您的方法返回Integer
,因为它可以自动取消装箱到int
,因此它适合int
的{{1}}返回类型。
您的特定代码可能抛出myMethod
的事实不是编译器可以检测到的。