阅读 JAVA 13 SE 规范,我在第 5 章第 5.1.7 节中找到。拳击转换有以下保证:
如果被装箱的值 p 是对 boolean、char、short、int 或 long 类型的常量表达式(第 15.28 节)求值的结果,并且结果为 true、false,则为 '\u0000' 到 ' 范围内的字符\u007f' 或 -128 到 127 范围内的整数(含),则令 a 和 b 为 p 的任意两次装箱转换的结果。总是 a == b
我觉得奇怪的是,字节类型的值从那个措辞中被忽略了。
例如,在如下代码中:
Byte b1=(byte)4;
Byte b2=(byte)4;
System.out.println(b1==b2);
我们有一个字节类型的常量表达式,在装箱之后,b1 和 b2 的值可能是也可能不是同一个对象。
没有演员表,它的工作方式实际上是一样的:
Byte b1=4;
在这里,我们在赋值上下文中有一个 int 类型的常量表达式。所以,根据规范
如果变量是 Byte、Short 或 Character 类型,并且常量表达式的值可以分别以 byte、short 或 char 类型表示,则可以使用紧缩原语转换后跟装箱转换。
所以表达式会被转换成byte,那个byte类型的值会被装箱,所以不能保证这个值是interned。
我的问题是我对规范的解释是正确的,还是我遗漏了什么?我查看了规范是否需要使用方法 Byte.valueOf() 进行装箱(可以保证),但事实并非如此。