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<Type>

Es sind nur Objekte zuweisungskompatibel, die selbst vom Typ Class<Type> 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<X> 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<X> 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<X> 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);
 

Schreibe den ersten Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.