请考虑以下代码段:
Integer Foo = 2;
int foo = 1;
boolean b = Foo < foo;
使用<
或int
完成Integer
?那么==
呢?
答案 0 :(得分:4)
对于所有关系运算符(包括<
和==
),如果一种类型是另一种类型的盒装模拟,则盒装类型将转换为未装箱的形式。
所以你的代码相当于Foo.intValue() < foo;
。这比您想象的要深:如果Foo < foo
为NullPointerException
,您的Foo
将抛出null
。
答案 1 :(得分:3)
根据JLS,15.20.1
数值比较运算符的每个操作数的类型必须是a 可转换的类型(第5.1.8节)到原始数字类型,或发生编译时错误。对操作数执行二进制数字提升(第5.6.2节)。
此外,5.6.2表示
如果任何操作数属于引用类型,则进行拆箱转换
这解释了程序中发生的情况:在执行比较之前,Integer
对象已取消装箱。
答案 2 :(得分:2)
由于Autoboxing and Unboxing,我们将使用int
完成这些操作。
答案 3 :(得分:0)
java中基元类型的包装类型从Object到兼容的基本类型自动“类型转换”(或自动装箱/拆箱)。因此,在将整数传递给比较运算符或算术运算符(如&lt;)之前,将整数转换为整数。 ,&gt; ,==,=,+和 - 等