Java 当预期返回类型不匹配时,为什么允许编译?

Java 当预期返回类型不匹配时,为什么允许编译?,java,Java,在这里,null显然不是允许返回的int类型,编译时错误是它的包装类。前 int fun(){ return (true?null:0); } 你可以这样做 Integer integ = null; 自动装箱和拆箱。但是当您运行该代码时,您将面临NPE,因为运行时会尝试将空整数转换为其对应的基元。这里没有不匹配的类型。你的例子可以简化为 int fun(){ return (true?integ:0); } 三元组将自动将0装箱为整数类型,该类型将自动取消装箱为整数。由于整数也可以是nu

在这里,null显然不是允许返回的int类型,编译时错误是它的包装类。前

int fun(){
return (true?null:0);
}
你可以这样做

Integer integ = null;

自动装箱和拆箱。但是当您运行该代码时,您将面临NPE,因为运行时会尝试将空整数转换为其对应的基元。

这里没有不匹配的类型。你的例子可以简化为

int fun(){
return (true?integ:0);
}
三元组将自动将0装箱为
整数
类型,该类型将自动取消装箱为
整数
。由于
整数
也可以是
null
,因此三元表达式中的两个表达式都具有相同的类型

null
分支将抛出NullPointerException。在我的示例中,您可以通过将
true
更改为
false
来查看


在我看来,这是Java中由于保留普通的旧数据类型而产生的缺陷之一,三元数据类型中的类型提升规则尤其有害。

值得一提的是,这将在调用时引发NullPointerException。@user1675642这是允许的。无法成功运行。
null
不会自动装箱,它只是一个根据定义可分配给任何引用类型的值。事实上。纠正了我草率的语言。对不起,我太迂腐了,我只是想帮忙,因为我看到人们对更少的选票投了反对票。:)一点也不。在这个领域,精确性非常重要。
public int foo()
{
    return true ? 0 : null;
}