Java 为什么'<''&燃气轮机';在'==';不';T

Java 为什么'<''&燃气轮机';在'==';不';T,java,Java,我知道“==”不适用于[-128127]范围之外的值,因为在此范围内有一个整数对象的缓存,如果值在该范围内,则返回相同的引用。但是为什么“>”、“=”、“操作符只为基元类型定义。因此,在包装器类型上使用它们会导致编译器将对象取消装箱为原语 这意味着 System.out.println(a>=b); 相当于 System.out.println(a.intValue()>=b.intValue()); 但是,=和=运算符,因此使用它们来比较基元包装器类型的两个对象会比较引用,而不

我知道“==”不适用于[-128127]范围之外的值,因为在此范围内有一个整数对象的缓存,如果值在该范围内,则返回相同的引用。但是为什么“>”、“=”、“操作符只为基元类型定义。因此,在包装器类型上使用它们会导致编译器将对象取消装箱为原语

这意味着

System.out.println(a>=b);
相当于

System.out.println(a.intValue()>=b.intValue());
但是,
=
=运算符,因此使用它们来比较基元包装器类型的两个对象会比较引用,而不是它们包装的基元值

正如Holger所评论的,对象引用与
==
的比较=,但与
相比,在引入自动取消装箱之前,任何引用类型都不支持
=

这意味着在Java的早期,代码片段的
a>=b
不会通过编译(因为
a
b
不是基本的数字类型)。另一方面,您的
a==b
代码段仍将通过编译并返回
false


更改
==
的行为=对于恰好是数字原语包装的引用类型,将更改现有代码的行为,从而破坏向后兼容性,这可能是它没有这样做的原因。

谢谢。我认为“>=”和“@GaurangSinghal-yesIt”也是如此,可能值得注意的是使用
=
的可能性=,因此无法定义它们来比较取消装箱的值,因为这会破坏兼容性。如果没有这一遗留问题,为引用比较定义不同的运算符是可能的,也是最干净的解决方案。不幸的是,那艘船已经开航了…@Holger,这是一个很好的观点。我将把它添加到答案中。谢谢@埃兰,不客气
System.out.println(a.intValue()>=b.intValue());