Sobes.tech
Middle

Quali funzionalità offrono i Generics in Java?

sobes.tech AI

Risposta dell'AI

I generici in Java migliorano la sicurezza dei tipi del codice, prevenendo errori di runtime legati al cast di tipi. Le principali funzionalità:

  • Verifica dei tipi in fase di compilazione: Il compilatore verifica l'uso corretto dei tipi specificati nei generici, consentendo di individuare errori prima dell'esecuzione del programma.

    // Senza generici - possibile ClassCastException
    List list = new ArrayList();
    list.add("stringa");
    list.add(123); // Aggiunta di un Integer
    String s = (String) list.get(1); // Errore a runtime
    
    // Con generici - errore di compilazione
    List<String> stringList = new ArrayList<>();
    stringList.add("stringa");
    // stringList.add(123); // Errore di compilazione
    String str = stringList.get(0); // Recupero sicuro
    
  • Eliminazione dei cast di tipo: I generici eliminano la necessità di cast espliciti quando si recuperano elementi da collezioni o si usano classi parametrizzate.

    // Senza generici
    List list = new ArrayList();
    list.add("Ciao");
    String s = (String) list.get(0); // Cast esplicito
    
    // Con generici
    List<String> stringList = new ArrayList<>();
    stringList.add("Ciao");
    String str = stringList.get(0); // Nessun cast necessario
    
  • Implementazione di codice generico: Permettono di creare algoritmi e strutture dati generiche che funzionano con diversi tipi, senza duplicare codice.

    // Metodo generico per stampare un array
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Classe generica - coppia di valori
    class Pair<K, V> {
        private K key;
        private V value;
    
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
    
        public K getKey() { return key; }
        public V getValue() { return value; }
    }
    
  • Supporto ai Wildcards: Permettono di definire restrizioni flessibili sui tipi nei tipi parametrizzati.

    • ? (Wildcard senza limiti): Qualunque tipo.
    • ? extends T (Wildcard con limite superiore): Il tipo deve essere T o un suo sottotipo.
    • ? super T (Wildcard con limite inferiore): Il tipo deve essere T o un suo supertipo.
    // Metodo che accetta una lista di qualsiasi tipo
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metodo che accetta una lista di numeri o dei loro sottotipi
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metodo che accetta una lista di stringhe o dei loro supertipi
    public static void addStrings(List<? super String> list) {
        list.add("nuova stringa");
    }
    
  • Utilizzo nel framework Collections: Tutte le principali classi di collezioni (List, Set, Map, ecc.) sono parametrizzate, rendendo il lavoro con le collezioni più sicuro in termini di tipi e più comodo.

I generici sono un elemento chiave di Java moderno, che aumenta l'affidabilità e la leggibilità del codice.