In Java ist es von entscheidender Bedeutung, die Einschränkungen der Verwendung von Platzhaltern mit Generika zu verstehen. Schauen wir uns das spezielle Problem des Hinzufügens von Elementen zu einer Liste an, die als List deklariert ist. erweitert Nummer>:
List<? extends Number> foo3 = new ArrayList<Integer>();
Wenn Sie versuchen, eine Ganzzahl zu foo3 hinzuzufügen, kann ein Fehler ähnlich der folgenden auftreten:
The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (ExtendsNumber)
Der Platzhalter ? erweitert Nummer in Liste erweitert Nummer> foo3 impliziert, dass foo3 Werte aus einer Familie von Typen enthalten kann, die Number erweitern. Dies bedeutet, dass die folgenden Zuweisungen alle gültig sind:
List<? extends Number> foo3 = new ArrayList<Number>(); // Number extends Number List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
Angesichts dieser Flexibilität wird es jedoch unmöglich, mit Sicherheit zu bestimmen, welche Art von Objekt Sie zu foo3 hinzufügen können, ohne seine Integrität zu verletzen. Das Hinzufügen einer Ganzzahl ist verboten, da foo3 möglicherweise auf eine List
Im Wesentlichen ist List erweitert T> garantiert, dass Sie nur daraus lesen können und ein T oder eine Unterklasse von T erhalten. Da Sie den spezifischen Typ der Liste nicht garantieren können, können Sie nicht sicher etwas hinzufügen.
Im Gegensatz dazu ist List< ;? super T> ermöglicht Ihnen das Hinzufügen von Werten vom Typ T oder seinen Unterklassen, da Sie sicher sein können, dass die Liste diese Werte enthalten kann, ohne ihre Typsicherheit zu verletzen.
Bedenken Sie die Signatur von Collections.copy():
public static <T> void copy(List<? super T> dest, List<? extends T> src)
Beachten Sie, dass Sie mit dem Platzhalter für src (? erweitert T) jede Liste übergeben können, die Folgendes enthält Werte vom Typ T oder seinen Unterklassen, wodurch garantiert wird, dass die von src erzeugten Werte vom Typ T oder seinen Unterklassen sind. Dadurch kann die Methode verschiedene Listentypen verarbeiten und Werte sicher kopieren.
Das Verständnis der Einschränkungen der Verwendung von Platzhaltern mit Generika ist für das Schreiben von robustem Java-Code unerlässlich. Denken Sie daran, dass Sie nichts zu einer Liste hinzufügen können erweitert T> weil Sie den spezifischen Typ der Liste, auf die es verweist, nicht garantieren können. Stattdessen können Sie nur daraus lesen und sicher sein, dass Sie Werte vom Typ T` oder seinen Unterklassen erhalten.
Das obige ist der detaillierte Inhalt vonWarum kann ich einer Liste keine Elemente hinzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!