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 essereTo un suo sottotipo.? super T(Wildcard con limite inferiore): Il tipo deve essereTo 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.