((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
我一直认为自动装箱等同于在相应类型上调用valueOf()
。我看到的每一个讨论关于这个主题的都似乎支持我的假设。但是我在JLS中找到的只有以下内容(§5.1.7):
这描述了类似于valueOf ()的行为。但似乎没有保证实际调用valueOf(),这意味着理论上可能存在一个为自动装箱值保留单独的专用缓存的实现。在这种情况下,缓存的自动装箱值和常规缓存的装箱值之间可能不存在标识相等性。
Oracle自动装箱教程中指出,li.add(i)
会被编译成li.add(Integer.valueOf(i))
,其中i
是一个int
类型。但我不确定该教程是否应被认为是权威来源。
*这个保证比valueOf()
稍微弱一些,因为它只涉及字面值。
valueOf()
;我的问题是JLS是否在这方面做出了任何保证。 - shmoselvalueOf
,没有任何与自动装箱相关的结果(只有关于Enum.valueOf
等的内容)。在我看来,这就解决了问题。 - aioobevalueOf
的编译器,或者如果javac切换到另一种解决方案,那么任何新发出的字节码都将与旧字节码不兼容,因为旧字节码用于自动装箱的valueOf
,而两个自动装箱的值必须(至少在某些情况下)是引用等效的。现在要将其与正式证明联系起来,就必须在JLS中找到某些声明分割编译的特定保证。虽然我怀疑JLS涵盖了这些主题。 - aioobevalueOf()
对我来说并不重要,因为没有行为上的区别。 - shmoselvalueOf
的现有类兼容的值,该怎么办? 如果valueOf
继续正常工作,我认为在编译好的类中调用它是没有理由不这样做的。任何更花哨的东西都可以被JVM注入,替换调用,在运行时执行。就像今天可能已经发生的一样。 - Holger