Varianztypen bei generischen Klassen in Java

Es gibt insgesamt vier verschiedene Varianztypen bei generischen Klassen in Java.

  1. Invarianz
  2. Bivarianz
  3. Kovarianz
  4. Kontravarianz

Diese erläutere ich im weiteren Verlauf kurz.

Invarianz: Class

Es sind nur Objekte zuweisungskompatibel, die selbst vom Typ Class sind.

  • Geschrieben werden können nur Objekte des Typs Type.
  • Gelesen werden Objekte des Typs Type.

Codebeispiel: Invarianz

ArrayList<Integer> l = new ArrayList<Integer>();
l.add(3);

// Es sind alle Integer-Methoden verfügbar
 double d = l.get(0).doubleValue()

Bivarianz: Class<?>

Es sind nur Objekte zuweisungskompatibel, die vom Typ Class sind, wobei X ein beliebiger Typ sein kann.

  • Geschrieben werden können beliebige Typen.
  • Gelesen werden Objekte des Typs Object.

Codebeispiel: Bivarianz

ArrayList<?> l = new ArrayList<Integer>();
 l.add(null);
 l.add("Good Times");
 Object o = l.get(0); // Es kann nur Object zugesichert werden
 

Kovarianz: Class<? extends Type>

Es sind nur Objekte zuweisungskompatibel, die vom Typ Class sind, wobei X vom Typ TypeX also Unterklasse von Type – sein muss.

  • Geschrieben werden können Objekte des Typs Type.
  • Gelesen werden Objekte des Typs Type.

Codebeispiel: Kovarianz

ArrayList<? extends Number> l = new ArrayList<Integer>();
 l.add(new Integer(3));
 l.add(null);
 Number n = l.get(0);
 

Kontravarianz: Class<? super Type>

Es sind nur Objekte zuweisungskompatibel, die vom Typ Class sind, wobei Type vom Typ XX also Oberklasse von Type – sein muss.

  • Geschrieben werden können Objekte des Typs Type.
  • Gelesen werden Objekte des Typs Object.

Codebeispiel: Kontravarianz

//ArrayList<? super Number> l = new ArrayList<Integer>(); //funktioniert hier nicht
 ArrayList<? super Number> l = new ArrayList<Object>();
 l.add(73);
 l.add(3.8);
 Object o = l.get(0);
 

Sie befinden sich auf einer archivierten Version von karllorey.de. Diese Seite wird seit 2015 nicht mehr aktualisiert. Blog-Artikel haben jeweils den Stand des Veröffentlichungsdatums.

Weitere Informationen finden Sie im letzten Blog-Artikel. Meine Webseite finden Sie nun unter karllorey.com.