Читая спецификацию JAVA 13 SE, я нашел в главе 5 раздел 5.1.7. Boxing Conversion следующие гарантии:
Если заключенное в рамку значение p является результатом вычисления константного выражения (§15.28) типа boolean, char, short, int или long, и результатом является true, false, символ в диапазоне от ' ' до ' ' включительно или целое число в диапазоне от -128 до 127 включительно, тогда пусть a и b будут результатами любых двух преобразований p в боксе. Всегда так, что a == b
Мне кажется странным, что значения типа byte не включены в эту формулировку.
Например, в таком коде, как:
Byte b1=(byte)4;
Byte b2=(byte)4;
System.out.println(b1==b2);
У нас есть константное выражение типа byte, и после упаковки значения b1 и b2 могут быть или не быть одним и тем же объектом.
На самом деле это работает так же без приведения:
Byte b1=4;
Здесь у нас есть константное выражение типа int в контексте присваивания. Так, согласно спецификации
Сужающее примитивное преобразование, за которым следует упаковывающее преобразование, может использоваться, если переменная имеет тип Byte, Short или Character, а значение константного выражения может быть представлено в типе byte, short или char соответственно.
Таким образом, выражение будет преобразовано в байт, и это значение типа байта будет помещено в коробку, поэтому нет гарантии, что значение будет интернировано.
Мой вопрос в том, правильно ли я интерпретирую спецификацию, или я что-то упускаю? Я посмотрел, требует ли спецификация использования метода Byte.valueOf() для упаковки (для чего это было бы гарантировано), но это не так.