Java 为什么'<''&燃气轮机';在'==';不';T
我知道“==”不适用于[-128127]范围之外的值,因为在此范围内有一个整数对象的缓存,如果值在该范围内,则返回相同的引用。但是为什么“>”、“=”、“操作符只为基元类型定义。因此,在包装器类型上使用它们会导致编译器将对象取消装箱为原语 这意味着Java 为什么'<''&燃气轮机';在'==';不';T,java,Java,我知道“==”不适用于[-128127]范围之外的值,因为在此范围内有一个整数对象的缓存,如果值在该范围内,则返回相同的引用。但是为什么“>”、“=”、“操作符只为基元类型定义。因此,在包装器类型上使用它们会导致编译器将对象取消装箱为原语 这意味着 System.out.println(a>=b); 相当于 System.out.println(a.intValue()>=b.intValue()); 但是,=和=运算符,因此使用它们来比较基元包装器类型的两个对象会比较引用,而不
System.out.println(a>=b);
相当于
System.out.println(a.intValue()>=b.intValue());
但是,=
和=对于基元类型和引用类型,都存在代码>运算符,因此使用它们来比较基元包装器类型的两个对象会比较引用,而不是它们包装的基元值
正如Holger所评论的,对象引用与==
和的比较=在引入自动装箱和自动取消装箱之前,Java语言中存在代码>,但与
相比,在引入自动取消装箱之前,任何引用类型都不支持=
这意味着在Java的早期,代码片段的a>=b
不会通过编译(因为a
和b
不是基本的数字类型)。另一方面,您的a==b
代码段仍将通过编译并返回false
更改==
和的行为=代码>对于恰好是数字原语包装的引用类型,将更改现有代码的行为,从而破坏向后兼容性,这可能是它没有这样做的原因。谢谢。我认为“>=”和“@GaurangSinghal-yesIt”也是如此,可能值得注意的是使用=
和的可能性=在引入自动取消装箱之前,Java中存在用于比较引用的代码>,因此无法定义它们来比较取消装箱的值,因为这会破坏兼容性。如果没有这一遗留问题,为引用比较定义不同的运算符是可能的,也是最干净的解决方案。不幸的是,那艘船已经开航了…@Holger,这是一个很好的观点。我将把它添加到答案中。谢谢@埃兰,不客气
System.out.println(a.intValue()>=b.intValue());