Sto cercando di determinare se le seguenti affermazioni sono garantiti per essere vero:Chiamata autoboxing valoreOf()?
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
Ho sempre pensato che autoboxing era equivalente a chiamare valueOf()
sul tipo corrispondente. Ogni discussion che ho visto su topic sembra essere il mio presupposto per support. Ma tutto quello che ho potuto trovare nella JLS è stata la seguente (§5.1.7):
Se il valore
p
essere inscatolato è un numero intero letterale di tipoint
tra-128
e127
compreso (§3.10.1), oppure il booleano letteraletrue
ofalse
(§3.10.3), o un carattere letterale tra'\u0000'
e'\u007f'
compreso (§3.10.4), poi lasciatea
eb
tramite i risultati di eventuali due conversioni boxep
. È sempre il caso dia == b
.
che descrive il comportamento identico
* simile a quella di valueOf()
. Ma non sembra esserci alcuna garanzia che venga effettivamente invocato lo valueOf()
, il che significa che potrebbe teoricamente essere un'implementazione che mantiene una cache dedicata separata per i valori autoboxed. In tal caso, potrebbe non esserci un'identità di identità tra i valori memorizzati in cache memorizzati nella cache e i valori regolari memorizzati nella cache.
Oracle's autoboxing tutorial afferma materia realisticamente che li.add(i)
viene compilato in li.add(Integer.valueOf(i))
, dove i
è un int
. Ma non so se il tutorial debba essere considerato una fonte autorevole.
* è una garanzia leggermente più debole rispetto valueOf()
, poiché si riferisce solo ai valori letterali.
@ Jean-FrançoisSavard Questo non è un duplicato di 408661. In effetti l'ho collegato alla mia domanda. So che generalmente si compila a 'valueOf()'; la mia domanda è se la JLS abbia qualche garanzia al riguardo. – shmosel
Interessante domanda teorica. Posso chiederti dove vuoi applicare questo? –
Questo tipo di domanda è difficile (ma non impossibile) per dare una risposta definitiva, perché (tecnicamente parlando) richiede di leggere l'intero JLS back to back e assicurarsi che non ci siano tali garanzie. (Ho [postato una domanda] (http://stackoverflow.com/questions/27566938/could-the-jit-collapse-two-volatile-reads-as-one-in-certain-expressions) con lo stesso problema un po ' fa.) Detto questo, ho cercato l'intero JLS per 'valueOf' e nessuno degli hit era legato alla autoboxing (solo cose su' Enum.valueOf' etc). Secondo me questo lo sistema. – aioobe