Java 三元if-else的自动拆箱需求

Java 三元if-else的自动拆箱需求,java,if-statement,conditional-operator,Java,If Statement,Conditional Operator,这段代码运行良好:- Integer nullInt = null; if (1 <= 3) { Integer secondNull = nullInt; } else { Integer secondNull = -1; } System.out.println("done"); Integer nullInt=null; if(1三元条件表达式的类型 1 <= 3 ? nullInt : -1 现在表达

这段代码运行良好:-

    Integer nullInt = null;
    if (1 <= 3) {
        Integer secondNull = nullInt;
    } else {
        Integer secondNull = -1;
    }
    System.out.println("done");
Integer nullInt=null;

if(1三元条件表达式的类型

1 <= 3 ? nullInt : -1

现在表达式的类型将是
Integer
,因此不会进行取消装箱操作。

我很确定三元运算符的参数必须是相同的类型。因为您使用-1和一些常量
nullint
编译器尝试取消装箱
nullint
以获取值。然后自动装箱以存储在
secondNull中变量。

这是因为当条件运算符
?:
的两个操作数是基元类型及其装箱引用类型时,将执行取消装箱转换():

数值条件表达式的类型确定如下:

  • 如果第二个和第三个操作数中的一个是基元类型T,而另一个的类型是对T应用装箱转换(§5.1.7)的结果,则条件表达式的类型是T
通常,将
if
语句替换为
?:
表达式并不总是保留代码的含义,因为
?:
表达式本身需要具有编译时类型。这意味着当两个操作数的类型不同时,必须对其中一个或两个进行转换,以便结果具有c编译时类型一致。

此类型有效(在Java 1.8中):


Integer secondNull=1只需添加到您的答案中,以下是提到的表格:
1 <= 3 ? nullInt : -1
1 <= 3 ? nullInt : Integer.valueOf(-1)