„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 17.12.2024
Durchsuche:681

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 Auswirkungen haben 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.

Betrachten 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 und 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 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 von untergeordneten Objekten in eine Liste von ? umgewandelt. 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 unveränderlicher Typsicherheit

Durch das Verbot des Hinzufügens von Werten zu generischen Wildcard-Sammlungen erzwingt Java die Sicherheit unveränderlicher Typen. 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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3