"Bene, finalmente... un'altra piccola lezione sui generici."

"Ora ti dirò come aggirare la cancellazione dei caratteri."

"Ah. È una cosa che voglio sapere."

"Come probabilmente già saprai, Java ha un tipo Class, che viene utilizzato per memorizzare un riferimento alla classe di un oggetto. "Ecco alcuni esempi:"

Esempi
Class clazz = Integer.class;
Class clazz = String.class;
Class clazz = "abc".getClass();

"Ah."

"Ma quello che probabilmente non sai è che esiste anche una classe generica chiamata Class. E le variabili Class generiche possono solo memorizzare riferimenti al tipo determinato dall'argomento type.  Ecco alcuni esempi:"

Esempi
Class<Integer> clazz1 = Integer.class; // Everything works well
Class<String> clazz2 = Integer.class; // Compilation error
Class<String> clazz1 = String.class; // Everything works well
Class<String> clazz2 = int.class; // Compilation error
Class<? extends String> clazz1 = "abc".getClass(); // Everything works well
Class<Object> clazz2 = "abc".getClass(); // Compilation error

"Perché funziona così?"

"Beh, il valore del campo della classe per Integer (cioè Integer.class) è in realtà un oggetto Class<Integer>."

"Ma andiamo avanti."

"Approfittando del fatto che Class<T> — è un generico e che questo tipo di variabile può contenere solo un valore di tipo T, puoi metterli insieme in un modo semplice come questo:"

Esempio
class Zoo<T>
{
 Class<T> clazz;
 ArrayList<T> animals = new ArrayList<T>

 Zoo(Class<T> clazz)
 {
  this.clazz = clazz;
 }

 public T createNewAnimal()
 {
  T animal = clazz.newInstance();
  animals.add(animal);
  return animal
 }
}
Utilizzo
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // This is where we pass the type!
Tiger tiger = zoo.createNewAnimal();

"Questa non è una manovra super complicata: stiamo semplicemente passando un riferimento al tipo desiderato. Ma, se usiamo semplicemente Class invece di Class<T>, allora qualcuno potrebbe passare accidentalmente due tipi diversi: uno come argomento T , e un altro al costruttore."

"Ah. Capisco. Non è successo niente di soprannaturale, ma neanche niente di terribile. C'è un riferimento al tipo, e puoi usarlo. Funziona e per me va bene."

"Il ragazzo diventa un uomo! 'Funziona e per me va bene' è spesso l'opzione migliore."

"Molte cose potrebbero essere rifatte in Java ora, ma dobbiamo mantenere la compatibilità con il vecchio codice."

"Le decine di migliaia di popolari librerie raffinate sono l'argomento più potente per Java oggi. Pertanto, Java rimane il linguaggio più popolare mantenendo la compatibilità con le versioni precedenti, quindi non può introdurre innovazioni radicali".

"Bene, costruirò il mio Java con il blackjack e..."

"Bene, sono già stanco per la giornata. Alla prossima volta."

"Arrivederci, Rishi, e grazie per questa lezione così interessante."