Java整数与字符串自动装箱设计

Tra*_*ebb 1 java autoboxing

在Java中,我可以执行以下操作来简洁地防范NullPointerException:

if ("myString".equals(someOtherString))
Run Code Online (Sandbox Code Playgroud)

但我不能对整数做同样的事,例如

if (5.equals(someOtherInteger))
Run Code Online (Sandbox Code Playgroud)

我收到编译时错误.有关为何做出此设计决定的任何想法?或者任何可能解释它的资源?提前致谢.

编辑:someOtherInteger是一个Integer,而不是一个int.

tru*_*ity 13

String一直是Java中的一个对象.字符串没有自动装箱,原则上不存在.最近已经引入int了从原语到Integer对象的自动装箱.

有问题的是,为什么尝试访问基元的成员变量不会调用自动装箱(95.toString(radix)实际上会非常方便),但我想原因是它不被认为是一个可能的用例,因为几乎每个wrappedPrimitive.method()都有一个等价的WrapperClass.method( primitive )版本.

equals()原始类型通常是不必要的,因为==已经存在.但是,你确实为它做了一个很好的例子,作为一个空值保护... 5 == integerInstance将尝试取消装箱实例,并且不幸的NullPointerExceptionnull,如果实例是,则抛出一个.(起初我并不完全理解你的观点.)

也就是说,如果我们能够从当前正在研究Java的人那里听到或者在引入自动装箱时听到他们是否考虑过这种功能,那将会非常酷.


Jef*_*rey 10

JLS指定装箱转换可以在分配的转换,方法调用转换或铸造的转换才会发生.由于既没有5为变量赋值,也没有将其作为参数传递给方法,也没有明确地将其转换为变量Integer,因此不会为您自动进行自动装箱.

赋值转换(第5.2节,第15.26节)将表达式的类型转换为指定变量的类型.

赋值转换可能导致OutOfMemoryError(由于装箱转换(第5.1.7节)),NullPointerException(由于取消装箱转换(第5.1.8节))或ClassCastException(由于未经检查的转换( §5.1.9))在运行时抛出.

方法调用转换(第5.3节,第15.9节,第15.12节)应用于方法或构造函数调用中的每个参数,并且除了一种情况外,执行与赋值转换相同的转换.

方法调用转换可能导致OutOfMemoryError(作为装箱转换(第5.1.7节)的结果),NullPointerException(作为拆箱转换(第5.1.8节)的结果)或ClassCastException(作为未经检查的转换的结果) (§5.1.9))在运行时抛出.


转换上下文允许使用以下之一:

...

一个拳击转换(第5.1.7节),可选地后跟一个加宽的引用转换(第5.1.5节)