Varianztypen bei generischen Klassen in Java
Es gibt insgesamt vier verschiedene Varianztypen bei generischen Klassen in Java.
- Invarianz
- Bivarianz
- Kovarianz
- Kontravarianz
Diese erläutere ich im weiteren Verlauf kurz.
Invarianz: Class
Es sind nur Objekte zuweisungskompatibel, die selbst vom Typ Class
- 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
- 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
- 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
- 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);