为什么盒装基元不支持所有运算符?

时间:2015-02-14 22:53:43

标签: java autoboxing

观看有效的Java视频我注意到盒装基元类型仅支持六个比较运算符中的四个<><=>=并且不支持&#39; t支持==!=

我的问题是为什么盒装基元不支持所有运算符?

2 个答案:

答案 0 :(得分:7)

他们支持==!=。他们只是没有做你期望的事情。

对于引用,==!=会告诉您两个引用是否相等 - 即它们是否引用相同的对象。

class Thingy {}
Thingy a = new Thingy();
Thingy b = new Thingy();
System.out.println(a == b); // prints false, because a and b refer to different objects

Thingy c = b;
System.out.println(b == c); // prints true, because b and c refer to the same object

这适用于所有引用类型,包括盒装基元:

Integer a = new Integer(50);
Integer b = new Integer(50);
System.out.println(a == b); // prints false, because a and b refer to different objects

Integer c = b;
System.out.println(b == c); // prints true, because b and c refer to the same object

现在,引用不支持<><=>=

Thingy a = new Thingy();
Thingy b = new Thingy();
System.out.println(a < b); // compile error

但是,盒装基元可以自动取消装箱,而未装箱的基元确实支持它们,因此编译器使用自动取消装箱:

Integer a = new Integer(42);
Integer a = new Integer(43);

System.out.println(a < b);
// is automatically converted to
System.out.println(a.intValue() < b.intValue());

==!=不会发生这种自动拆箱,因为这些运营商在没有自动拆箱的情况下已经有效 - 他们只是不按预期执行。

答案 1 :(得分:2)

因为在java中,==!=运算符总是通过引用来比较对象,而盒装类型是对象。