Kovarianz von Java-Generika
In Java sind Generika nicht kovariant, wie im bereitgestellten Artikel erläutert. Das heißt, wenn eine Klasse eine generische Klasse erweitert, kann der generische Typ der untergeordneten Klasse kein Untertyp des generischen Typs der übergeordneten Klasse sein.
Das „Alias“-Konzept verstehen
Der Autor erwähnt, dass „wenn ln mit li aliasiert würde“, dies das Versprechen der Typsicherheit brechen würde. Ein Alias bezieht sich auf einen alternativen Namen oder eine Referenz auf ein Objekt. In diesem Szenario ist li ein Alias von ln.
Ein anschauliches Beispiel
Betrachten Sie den folgenden Code:
List<Integer> li = new ArrayList<Integer>(); List<Number> ln = li; // illegal ln.add(new Float(3.1415));
Obwohl Integer von erbt Nummer, das Hinzufügen eines Float-Objekts zu ln ist illegal. Dies liegt daran, dass wir durch Aliasing von li zu ln im Wesentlichen sagen, dass li Zahlen enthalten kann. Allerdings wurde li ursprünglich nur für die Speicherung von Ganzzahlen deklariert. Daher verstößt das Hinzufügen eines Floats zu ln gegen die Typsicherheitsgarantie von li.
Schlussfolgerung
Dieses Beispiel zeigt, dass Generika in Java nicht kovariant sind. Der Versuch, den generischen Typ einer Unterklasse dem generischen Typ einer Oberklasse zuzuweisen, führt zu einem Fehler bei der Kompilierung.
Das obige ist der detaillierte Inhalt vonWarum sind Java-Generika nicht kovariant?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!