Я пытаюсь определить, являются ли следующие утверждения гарантированно верно:Имеет ли значение autoboxing valueOf()?
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
Я всегда считал, что Autoboxing был эквивалентен вызову valueOf()
по соответствующему типу. Каждый discussion, который я видел на topic, кажется support моим предположением. Но все, что я мог бы найти в 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()
, то есть теоретически может быть реализация, которая хранит отдельный выделенный кеш для автономных значений. В таком случае может существовать не равенство идентичности между кешированными значениями autoboxed и регулярными кэшированными значениями в коробке.
Oracle's autoboxing tutorial утверждает, как ни в чем не бывало, что li.add(i)
компилируется li.add(Integer.valueOf(i))
, где i
является int
. Но я не знаю, следует ли считать учебник авторитетным источником.
* Это немного слабее, чем гарантия valueOf()
, как это относится только к буквенным значениям.
@ Jean-FrançoisSavard Это не дубликат 408661. На самом деле я связан с этим в моем вопросе. Я знаю, что он обычно компилируется в 'valueOf()'; мой вопрос заключается в том, дает ли JLS какую-либо гарантию в этом отношении. – shmosel
Интересный теоретический вопрос. Могу ли я спросить, где вы хотите применить это? –
Этот вопрос является трудным (но не невозможным), чтобы дать окончательный ответ, потому что он (технически говорящий) требует, чтобы вы прочитали всю JLS назад и убедитесь, что таких гарантий нет. (Я [разместил вопрос] (http://stackoverflow.com/questions/27566938/could-the-jit-collapse-two-volatile-reads-as-one-in-certain-expressions) с той же проблемой a while назад.) При этом я искал всю JLS для 'valueOf', и ни один из хитов не был связан с autoboxing (только материал о' Enum.valueOf' и т. д.). По-моему, это решает. – aioobe