Lezioni del modulo (2/2)
Tipi Generici in Java
I Generics (Tipi Generici) sono stati introdotti in Java per consentire a classi, interfacce e metodi di operare su tipi diversi come parametri, garantendo il controllo dei tipi a tempo di compilazione (Compile-time Type Safety) ed evitando costosi cast espliciti a runtime.
Classi Generiche
Una classe generica viene definita utilizzando le parentesi angolari <T> dove T rappresenta un segnaposto per un tipo che verrà specificato al momento dell'istanziazione.
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Quando creiamo un oggetto di tipo Box, specifichiamo il tipo effettivo:
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
int value = integerBox.getContent(); // Nessun cast necessario!
Metodi Generici
È possibile definire un singolo metodo generico in grado di accettare parametri di tipo differenti. Il parametro di tipo viene posizionato prima del tipo di ritorno del metodo.
public static <E> void printArray(E[] elements) {
for (E element : elements) {
System.out.println(element);
}
}
Limitazioni dei Generics (Wildcards)
Possiamo limitare i tipi accettati da un generico tramite la parola chiave extends (limite superiore) per accettare un tipo specifico o le sue sottoclassi.
public static <T extends Number> void processNumber(T number) {
// Accetta Integer, Double, Float, ecc.
System.out.println(number.doubleValue());
}
Prova tu
Completa la classe generica Box definendo il getter getValue() che ritorna T e il setter setValue(T value) che imposta la variabile privata value.
Mostra suggerimento
Scrivi i metodi con la giusta firma usando il parametro di tipo generico `T`.
Soluzione disponibile dopo 3 tentativi
Crea un metodo generico statico printArray che prende in ingresso un array di tipo T[] denominato array e stampa ciascun elemento tramite un ciclo for-each.
Mostra suggerimento
Il parametro di tipo `<T>` va posizionato subito dopo `static` e prima del valore di ritorno `void`.
Soluzione disponibile dopo 3 tentativi
Crea una classe statica StringContainer che implementa l'interfaccia Container parametrizzata con String. Definisci un costruttore che accetta un parametro String e implementa il metodo getItem().
Mostra suggerimento
Sostituisci il tipo generico `T` con `String` nella firma della classe e nel tipo di ritorno del metodo `getItem()`.
Soluzione disponibile dopo 3 tentativi