„Nun, endlich – noch eine kleine Lektion über Generika.“

„Jetzt erkläre ich Ihnen, wie Sie das Löschen von Schriftarten umgehen können.“

„Ah. Das ist etwas, was ich wissen möchte.“

„Wie Sie wahrscheinlich bereits wissen, verfügt Java über einen Klassentyp, der zum Speichern einer Referenz auf die Klasse eines Objekts verwendet wird.“ Hier einige Beispiele:

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

"Ah."

„Aber was Sie wahrscheinlich nicht wissen, ist, dass es auch eine generische Klasse namens Class gibt. Und generische Klassenvariablen können nur Verweise auf den Typ speichern, der durch das Typargument bestimmt wird.  Hier sind einige Beispiele:“

Beispiele
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

„Warum funktioniert das so?“

„Nun, der Wert des Klassenfelds für Integer (dh Integer.class) ist tatsächlich ein Class<Integer>-Objekt.“

„Aber lasst uns weitermachen.“

„Unter Ausnutzung der Tatsache, dass Class<T> ein generisches Element ist und dieser Variablentyp nur einen Wert vom Typ T enthalten kann, können Sie sie auf raffinierte Weise wie folgt zusammensetzen:“

Beispiel
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
 }
}
Verwendung
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // This is where we pass the type!
Tiger tiger = zoo.createNewAnimal();

„Das ist kein besonders kniffliges Manöver – wir übergeben lediglich einen Verweis auf den gewünschten Typ. Wenn wir jedoch einfach Class anstelle von Class<T> verwenden, könnte jemand versehentlich zwei verschiedene Typen übergeben: einen als T-Argument und ein weiteres an den Konstruktor.

„Ah. Ich verstehe. Es ist nichts Übernatürliches passiert, aber auch nichts Schreckliches. Es gibt einen Hinweis auf den Typ, und Sie können ihn verwenden. Es funktioniert und das ist gut genug für mich.“

„Aus dem Jungen wird ein Mann! ‚Es funktioniert und das reicht mir‘ ist oft die beste Option.“

„Viele Dinge könnten jetzt in Java neu gemacht werden, aber wir müssen die Kompatibilität mit altem Code aufrechterhalten.“

„Die Zehntausenden beliebter, ausgefeilter Bibliotheken sind heute das stärkste Argument für Java. Daher bleibt Java aufgrund der Beibehaltung der Abwärtskompatibilität die beliebteste Sprache und kann daher keine radikalen Innovationen einführen.“

„Nun, ich werde mein eigenes Java mit Blackjack erstellen und…“

„Gut, ich bin schon müde von dem Tag. Bis zum nächsten Mal.“

„Auf Wiedersehen, Rishi, und vielen Dank für diese interessante Lektion.“