Heim >Java >javaLernprogramm >Warum kann ich einer Liste keine Elemente hinzufügen?

Warum kann ich einer Liste keine Elemente hinzufügen?

Susan Sarandon
Susan SarandonOriginal
2024-12-18 09:05:10619Durchsuche

Why Can't I Add Elements to a List

Liste verstehen Datenstrukturen

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:

List<? extends Number> foo3 = new ArrayList<Integer&gt();

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)

Warum Sie nicht zur Liste hinzufügen können

Der Platzhalter ? erweitert Nummer in Liste 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 verweist. Ebenso ist das Hinzufügen eines Doubles verboten, da foo3 möglicherweise auf eine List verweist.

Die Garantie der Abstraktion

Im Wesentlichen ist List 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.

Beispiel: Collections.copy() verstehen

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.

Fazit

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn