Heim >Java >javaLernprogramm >Warum kann ich einer Java-Sammlung keine Elemente mit einem generischen Platzhaltertyp („? erweitert übergeordnetes Element') hinzufügen?

Warum kann ich einer Java-Sammlung keine Elemente mit einem generischen Platzhaltertyp („? erweitert übergeordnetes Element') hinzufügen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-01 05:28:27373Durchsuche

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

Typsicherheit und Wildcard-Generika: Den verbotenen Modifikator verstehen

Bei der Arbeit mit generischen Sammlungen in Java kann das Konzept der Wildcard-Generika bestimmte eingeführt werden Einschränkungen, die zunächst möglicherweise kontraintuitiv erscheinen. Ein Paradebeispiel ist die Unfähigkeit, Werte zu einer Java-Sammlung mit einem generischen Platzhaltertyp hinzuzufügen.

Bedenken Sie den folgenden Codeausschnitt:

List<? extends Parent> list = ...;
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)

Warum kann dieser Code nicht kompiliert werden? Die Antwort liegt in den inhärenten Sicherheitsmechanismen, die durch Wildcard-Generika erzwungen werden.

Das Prinzip des uneingeschränkten Abrufs und der eingeschränkten Addition

Der generische Wildcard-Typ, gekennzeichnet durch ? erweitert Parent, stellt eine Liste von Elementen dar, die Nachkommen der Parent-Schnittstelle sind. Während es den uneingeschränkten Abruf dieser Elemente ermöglicht, schreibt die Typsicherheit Einschränkungen beim Hinzufügen von Werten zur Sammlung vor.

Wenn der Code kompiliert werden dürfte, würde er die Zuweisung einer übergeordneten Instanz zu einem Element innerhalb der Liste ermöglichen. Diese Aktion könnte jedoch möglicherweise die Typsicherheit beeinträchtigen.

Stellen Sie sich das folgende Szenario vor:

List<Child> childList = new ArrayList<>();
childList.add(new Child());

List<? extends Parent> parentList = childList;
parentList.set(0, new Parent());

Child child = childList.get(0); // No! It's not a child! Type safety is broken...

In diesem Szenario wird eine Liste untergeordneter Objekte in eine Liste umgewandelt von ? erweitert Parent. Die anschließende Zuweisung einer übergeordneten Instanz zum ersten Element der Liste verstößt gegen die Typsicherheit, da die resultierende Liste ein Element enthält, das keine gültige untergeordnete Instanz ist.

Gewährleistung der unveränderlichen Typsicherheit

Durch das Verbot des Hinzufügens von Werten zu generischen Wildcard-Sammlungen erzwingt Java unveränderliche Typsicherheit. Dadurch wird sichergestellt, dass die Elemente der Liste immer den durch den deklarierten Typ auferlegten Einschränkungen entsprechen.

Ohne diese Einschränkung wäre die Typsicherheit gefährdet, was zu potenziellen Fehlern und unerwartetem Verhalten führen würde.

Das obige ist der detaillierte Inhalt vonWarum kann ich einer Java-Sammlung keine Elemente mit einem generischen Platzhaltertyp („? erweitert übergeordnetes Element') 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