Я пытаюсь определить, гарантируются ли следующие утверждения:
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
Я всегда предполагал, что автобоксинг эквивалентен вызову 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()
действительно вызывается, то есть теоретически может быть реализация, которая хранит отдельный выделенный выделенный кеш для автономных значений. В таком случае может существовать не равенство идентичности между кешированными автобоксами и регулярными кэшированными значениями в коробке.
Учебник по autoboxing для Oracle утверждает, что li.add(i)
скомпилирован в li.add(Integer.valueOf(i))
, где i
является int
. Но я не знаю, следует ли считать учебник авторитетным источником.
* Это немного слабее, чем valueOf()
, поскольку это относится только к буквальным значениям.