Java/Tipi di dato: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Riga 40:
== Conversioni ==
Le conversioni in Java si chiamano anche operazioni di ''cast''. Una conversione ammessa dal linguaggio può essere realizzata in due soli modi: con ''cast esplicito'' o con ''cast implicito''. Il primo si ha utilizzando l'apposito operatore; il secondo, invece, viene gestito in automatico dal compilatore e non ha
L'idea che sta alla base di
Per quanto riguarda i tipi base:
*non sono ammesse conversioni tra ''boolean'' e i tipi numerici; si noti che questo comportamento è differente da quello che si ha nel C;
*al contrario, sono ammesse tutte le conversioni da un certo tipo numerico verso un altro tipo numerico;
*ma richiedono necessariamente il cast esplicito tutte le conversioni da un tipo numerico più "
Per quanto riguarda le classi:
Riga 54:
Il motivo è che
*nel primo caso, la conversione riesce sempre; per esempio, ogni istanza di [http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html java.util.ArrayList] sicuramente è anche un'istanza di [http://download.oracle.com/javase/6/docs/api/java/util/Collection.html java.util.Collection];
*nel secondo, invece, potrebbe non riuscire: un oggetto [http://download.oracle.com/javase/6/docs/api/java/util/Collection.html Collection] potrebbe non essere un'istanza di [http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html ArrayList],
=== Classi wrapper ===
Dovunque sia necessario un oggetto in luogo di un valore di un tipo base, si può usare una delle classi wrapper definite nel package java.lang:
*boolean: [http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html java.lang.Boolean]
Line 74 ⟶ 69:
Esiste una classe anche per il tipo ''void'' [http://download.oracle.com/javase/6/docs/api/java/lang/Void.html java.lang.Void], sebbene questo tipo non definisca alcun valore. Essa è utilizzata in contesti particolari, tipicamente quando si usa la ''reflection''.
Per i tipi numerici esistono anche le classi [http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html java.math.BigInteger] e [http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html java.math.BigDecimal], le quali, però, non sono considerate classi wrapper. Queste due classi permettono di rappresentare numeri interi o decimali
Le classi wrapper sono molto utili dovunque sia necessario interagire con una parte del programma scritta per lavorare su oggetti. Ad esempio, non è possibile aggiungere un intero ad una collezione, perché le collezioni sono scritte come contenitori di ''oggetti'', quindi è necessario prima racchiudere il numero in un oggetto, dopodiché si aggiunge questo oggetto alla collezione.
==== Autoboxing e unboxing ====▼
La famiglia dei tipi base e la famiglia dei tipi riferimento sono separate l'una dall'altra: esse definiscono due gerarchie distinte che non hanno alcun punto di giunzione. Per questo motivo, fino alla terza edizione delle specifiche di linguaggio, non erano ammesse conversioni tra tipi primitivi e tipi riferimento, né tramite ''cast'' esplicito, né tramite ''cast'' implicito.▼
▲==== Autoboxing e unboxing ====
Tuttavia, le classi wrapper definite nel package <tt>java.lang</tt> permettono di associare un oggetto a un valore del tipo primitivo corrispondente, e viceversa. Ad esempio, era possibile ottenere un oggetto <tt>Integer</tt> partendo da un <tt>int</tt>, invocando il costruttore [http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#Integer(int) Integer(int)], ed è possibile ottenere il numero intero corrispondente tramite il metodo [http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#intValue() intValue()]. Un discorso analogo vale per ciascuno degli altri tipi primitivi.▼
▲La famiglia dei tipi base e la famiglia dei tipi riferimento sono separate l'una dall'altra
▲
Prima di Java 5, era necessario invocare esplicitamente i costruttori e i metodi <tt>xxxValue()</tt> appropriati. Per rendere più
Quindi, da Java 5 in poi, è possibile scrivere
<tt>Integer k =
invece di:
<tt>Integer k = new Integer(200);</tt> // oppure Integer k = Integer.valueOf(
▲ <tt>Integer k = new Integer(3);</tt>
<tt>int j = k.intValue();</tt>
▲ <tt>Integer k = Integer.valueOf(3);</tt><ref>Il metodo [http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html#valueOf(int) valueOf(int)] è stato introdotto in Java 5.</ref>
▲in quanto la conversione viene tradotta automaticamente dal compilatore.
La conversione da tipo primitivo a tipo wrapper è detta ''autoboxing'',<ref group="F">[http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7 The Java Language Specification, Chapter 5]</ref><ref group="F">[http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html Java Programming Language, Autoboxing]</ref> mentre la conversione inversa è detta ''unboxing''<ref group="F">[http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.8 The Java Language Specification, Chapter 5]</ref>. Si noti che questi due meccanismi sono solo zucchero sintattico
== Le stringhe ==
|