Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [JAVA] Tipi generici

  1. #1

    [JAVA] Tipi generici

    Salve,

    volevo chiedere a cosa servono i "tipi generici", non riesco a capire la loro utilità

  2. #2

    Moderazione

    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.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da sharkkk Visualizza il messaggio
    volevo chiedere a cosa servono i "tipi generici", non riesco a capire la loro utilità
    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:

    codice:
    public class Coppia<T> {
        private T primo;
        private T secondo;
    
        // costruttore/i, metodi getter/setter, ecc...
    }
    Ora puoi scrivere es.:

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Grazie mille per la risposta, penso di aver capito abbastanza dalla tua risposta.

    volevo chiederti una delucidazione, un ipotetica classe Dividi
    codice:
    Dividi <int, double>
    implica come penso io che la classe Dividi opererà con interi o double oppure significa altro?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da sharkkk Visualizza il messaggio
    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.

    Quote Originariamente inviata da sharkkk Visualizza il messaggio
    implica come penso io che la classe Dividi opererà con interi o double oppure significa altro?
    "", 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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.