Sia casting che box/unboxing hanno a che fare con tipi e conversioni apparenti (o reali), ma boxing/unboxing è specifico della relazione tra tipi primitivi e tipi di wrapper corrispondenti, mentre casting è il termine esplicito o implicito cambiamento di tipo in senso più generale.
Casting è un termine generico con due significati correlati ma differenti-:
Trattare un valore di un tipo come se fosse un valore di un altro tipo. Due esempi di questo primo utilizzo sono:
1.1. Dato che la classe B
estende la classe A
, è possibile richiedereun'istanza di B
da trattare come un'istanza di A
scrivendo ((A) myB)
ovunque possa essere visualizzato un riferimento a un'istanza di A
. Questo in realtà non produce una nuova istanza di A
.
1.2. Le collezioni Pre-Java5 memorizzavano tutto il contenuto come Object
; questo di solito richiedeva di usare un cast dopo aver recuperato un oggetto da una collezione. Ad esempio, se hai memorizzato un numero String
in un Map
e hai bisogno di ottenere la sua lunghezza, dovresti scrivere qualcosa come ((String) myMap.get(someKey)).length()
dove il cast sarebbe richiesto per chiamare il metodo String
length
. Anche in questo caso, ciò non causa la creazione di un nuovo String
.
Esplicitamente un tipo a un altro (cioè modifica esplicita della rappresentazione). Un esempio di questo secondo utilizzo è nell'espressione ((int) (float_var + 0.5F))
che arrotonda una variabile in virgola mobile aggiungendo 0,5 (che produce un valore in virgola mobile) e quindi convertendo esplicitamente tale valore in un numero intero. Il valore intero risultante (dopo il cast (int)
) è prodotto dall'altro valore tramite il calcolo interno.
Casting può essere fatto quando c'è una superclasse/sottoclasse o rapporto interfaccia/implementatori (cioè 1 sopra) o quando i due tipi sono primitivi tipi numerici (significato 2). Potresti cercare "allargando" e "restringendo" per maggiori dettagli.
Il boxing si riferisce al wrapping di tipi primitivi in oggetti contenitore, in genere eseguiti solo quando è necessario disporre di un oggetto (ad esempio, memorizzare un valore in una raccolta).I tipi primitivi e involucro in coppie:
int Integer
long Long
boolean Boolean
... ...
Unboxing significa semplicemente recuperare il valore primitivo dall'interno suo involucro oggetto.
A partire da Java5, quando si scrive un'espressione che utilizza un valore primitivo in cui è richiesto il corrispondente tipo di wrapper (come l'inserimento di un intero in una raccolta), il compilatore inserisce automaticamente il codice che racchiude effettivamente quel valore primitivo . Allo stesso modo fornirà il codice unwrapping per te.
Così, invece di scrivere (in pre-Java5) qualcosa come:
Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;
si può scrivere:
Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;
e il codice di boxe/unboxing è inserito dal compilatore.
fonte
2009-02-01 22:46:03
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html sembra utile –