Wie wird in Java-Generika die Kontravarianz verwendet?
In Java kann der API-Designer durch Kovarianz festlegen, dass eine Instanz als bestimmter Typ oder als einer der Untertypen dieses Typs verallgemeinert werden kann. Beispielsweise
List<? extends Shape> shapes = new ArrayList<Circle>();
// where type Circle extends Shape
Contravariance geht in die andere Richtung. Hiermit können wir festlegen, dass eine Instanz als bestimmter Typ oder Supertyp verallgemeinert werden kann.
List<? super Shape> shapes = new ArrayList<Geometry>();
// where Shape extends Geometry
Wie ist die Kontravarianz von Java-Generika nützlich? Wann möchten Sie es verwenden?