Ecco degli esercizi con soluzione per praticare l’uso dei Generics in Java.
Esercizio 1: Classe Generica Semplice
Creare una classe generica `Box` che può contenere un oggetto di qualsiasi tipo.
public class Box<T> { private T contenuto;
public void setContenuto(T contenuto) { this.contenuto = contenuto; }
public T getContenuto() { return contenuto; }
public static void main(String[] args) { Box<String> boxStringa = new Box<>(); boxStringa.setContenuto("Ciao"); System.out.println("Contenuto: " + boxStringa.getContenuto());
Box<Integer> boxIntero = new Box<>(); boxIntero.setContenuto(123); System.out.println("Contenuto: " + boxIntero.getContenuto()); }}
Esercizio 2: Metodo Generico
Creare un metodo generico che accetta un parametro di qualsiasi tipo e lo stampa.
public class MetodoGenerico { public static <T> void stampa(T elemento) { System.out.println("Elemento: " + elemento); }
public static void main(String[] args) { stampa("Ciao"); stampa(123); stampa(3.14); }}
Esercizio 3: Generics con Più Tipi
Creare una classe generica `Coppia` che può contenere due oggetti di qualsiasi tipo.
public class Coppia<T, U> { private T primo; private U secondo;
public Coppia(T primo, U secondo) { this.primo = primo; this.secondo = secondo; }
public T getPrimo() { return primo; }
public U getSecondo() { return secondo; }
public static void main(String[] args) { Coppia<String, Integer> coppia = new Coppia<>("Ciao", 123); System.out.println("Primo: " + coppia.getPrimo()); System.out.println("Secondo: " + coppia.getSecondo()); }}
Esercizio 4: Bounded Generics
Creare una classe generica che accetta solo tipi che estendono `Number`.
public class NumeroBox<T extends Number> { private T numero;
public NumeroBox(T numero) { this.numero = numero; }
public T getNumero() { return numero; }
public static void main(String[] args) { NumeroBox<Integer> boxIntero = new NumeroBox<>(123); System.out.println("Numero: " + boxIntero.getNumero());
NumeroBox<Double> boxDouble = new NumeroBox<>(3.14); System.out.println("Numero: " + boxDouble.getNumero()); }}
Esercizio 5: Wildcard con Upper Bound
Utilizzare una wildcard con upper bound per accettare una lista di elementi che sono sottotipi di `Number`.
import java.util.ArrayList;import java.util.List;
public class WildcardUpperBound { public static void sommaNumeri(List<? extends Number> lista) { double somma = 0; for (Number numero : lista) { somma += numero.doubleValue(); } System.out.println("Somma: " + somma); }
public static void main(String[] args) { List<Integer> listaInteri = new ArrayList<>(); listaInteri.add(1); listaInteri.add(2); listaInteri.add(3); sommaNumeri(listaInteri);
List<Double> listaDouble = new ArrayList<>(); listaDouble.add(1.1); listaDouble.add(2.2); listaDouble.add(3.3); sommaNumeri(listaDouble); }}
Esercizio 6: Wildcard con Lower Bound
Utilizzare una wildcard con lower bound per accettare una lista di elementi che sono supertipi di `Integer`.
import java.util.ArrayList;import java.util.List;
public class WildcardLowerBound { public static void aggiungiNumeri(List<? super Integer> lista) { for (int i = 1; i <= 5; i++) { lista.add(i); } }
public static void main(String[] args) { List<Number> listaNumeri = new ArrayList<>(); aggiungiNumeri(listaNumeri); System.out.println("Lista: " + listaNumeri); }}
Esercizio 7: Generics e EreditarietÃ
Creare una classe generica `Contenitore` con un metodo che accetta un parametro generico e stampare il contenuto.
public class Contenitore<T> { private T contenuto;
public void setContenuto(T contenuto) { this.contenuto = contenuto; }
public T getContenuto() { return contenuto; }
public static void main(String[] args) { Contenitore<String> contenitoreStringa = new Contenitore<>(); contenitoreStringa.setContenuto("Ciao mondo"); System.out.println("Contenuto: " + contenitoreStringa.getContenuto());
Contenitore<Integer> contenitoreIntero = new Contenitore<>(); contenitoreIntero.setContenuto(42); System.out.println("Contenuto: " + contenitoreIntero.getContenuto()); }}
Esercizio 8: Metodi Generici con Tipi Multipli
Creare un metodo generico che accetta due parametri di tipi diversi e li stampa.
public class MetodoGenericoMultiplo { public static <T, U> void stampa(T primo, U secondo) { System.out.println("Primo: " + primo); System.out.println("Secondo: " + secondo); }
public static void main(String[] args) { stampa("Ciao", 123); stampa(3.14, "Mondo"); }}