Salve,
volevo chiedere a cosa servono i "tipi generici", non riesco a capire la loro utilità![]()
Salve,
volevo chiedere a cosa servono i "tipi generici", non riesco a capire la loro utilità![]()
Benvenuto sul forum!Le discussioni relative a Java non sono trattate qui, ma nell'apposita sottosezione.
Provvedo a spostare il thread; nel frattempo ti consiglio di dare un'occhiata al regolamento.
![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Immagina di dover fare una classe Coppia che deve contenere 2 oggetti dello stesso tipo. Ma il tipo può essere uno qualunque. Senza i generics (pre Java 5) l'unica soluzione era Object.
codice:public class Coppia { private Object primo; private Object secondo; // costruttore/i, metodi getter/setter, ecc... }
A parte il fatto che in questo modo non è possibile impedire, a livello di compilazione, di usare tipi differenti. Il che potrebbe andare bene oppure no. Ma in ogni caso i metodi setter/getter trattano Object e per i getter, ogni volta che ottieni l'oggetto devi fare tu un cast esplicito al tuo tipo specifico (es. String). Ovviamente scomodo e potenzialmente causa di errori.
Da Java 5 puoi fare:
Ora puoi scrivere es.:codice:public class Coppia<T> { private T primo; private T secondo; // costruttore/i, metodi getter/setter, ecc... }
codice:Coppia<String> coppiaDiStringhe = new Coppia<String>(); coppiaDiStringhe.setPrimo("aaa"); String valore1 = coppiaDiStringhe.getPrimo();
A livello di compilazione diventa type-safe. Non puoi fare coppiaDiStringhe.setPrimo(123); (o qualunque altro valore non String). Il compilatore te lo impedisce subito.
E inoltre viene inserito un cast implicito quando estrai un valore, ovvero quando usi uno dei metodi getter.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Grazie mille per la risposta, penso di aver capito abbastanza dalla tua risposta.
volevo chiederti una delucidazione, un ipotetica classe Dividi
implica come penso io che la classe Dividi opererà con interi o double oppure significa altro?codice:Dividi <int, double>
Innanzitutto una cosa importante: nei generics, le parametrizzazioni possono essere fatte solo con tipi "reference" (es. Integer, Double, ecc...), non con tipi primitivi. Quindi int e double non sono usabili.
"Nì", la classe Dividi potrebbe, teoricamente essere dichiarata così:
public class Dividi<O1 extends Number, O2 extends Number> { ........
(il extends è solo per restringere il campo dei tipi possibili)
Il punto è che in Dividi le due type variable O1 e O2 tecnicamente vengono viste a runtime appunto come Number. E Number è un tipo che generalizza i vari wrapper Integer, Double ecc.... che hanno i vari metodi intValue(), doubleValue() ecc...
Quindi cosa potrebbe fare Dividi ..... è tutto da valutare.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet