我正在尝试确定以下语句是否保证是真的:
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
Run Code Online (Sandbox Code Playgroud)
我一直认为自动装箱相当于调用valueOf()相应的类型.我在这个主题上看到的每一个讨论似乎都支持我的假设.但我在JLS中找到的只有以下内容(§5.1.7):
如果该值
p被装箱是整数文本类型的int之间-128和127包容性(§3.10.1)或布尔值true或false(§3.10.3),或字符之间文字'\u0000'和'\u007f'包容性(§3.10.4),然后让a与b是任何两个拳击转换的结果p.情况总是如此a == b.
这描述的行为与*相似valueOf().但似乎没有任何valueOf()实际调用的保证,这意味着理论上可以有一个实现为自动装箱值保留一个单独的专用缓存.在这种情况下,缓存的自动装箱值与常规缓存的装箱值之间可能不存在标识相同性.
Oracle的自动装箱教程说明了li.add(i)编译到的事实li.add(Integer.valueOf(i)),其中i是一个int.但我不知道该教程是否应被视为权威来源.
*这是一个稍微弱一点的保证valueOf(),因为它只是指字面值.
据我所知,下面的代码应该打印"true",但是当我运行它时会打印出来"false".
public class Test {
public static boolean testTrue() {
return true;
}
public static void main(String[] args) throws Exception {
Object trueResult = Test.class.getMethod("testTrue").invoke(null);
System.out.println(trueResult == Boolean.TRUE);
}
}
Run Code Online (Sandbox Code Playgroud)
如果该值
p被装箱是true,false,一个byte,或一个char在所述范围内\u0000对\u007f或int或short之间号-128和127(含),然后让和是任何两个装箱转换的结果.情况总是如此.r1r2pr1 == r2
但是,如果通过反射调用方法,则始终通过框创建值new PrimitiveWrapper().
请帮我理解这个.