Heim >Java >javaLernprogramm >Warum kann ich einer „Liste' keine „übergeordnete' Instanz hinzufügen?

Warum kann ich einer „Liste' keine „übergeordnete' Instanz hinzufügen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-30 19:34:11930Durchsuche

Why Can't I Add a `Parent` Instance to a `List

Komplikationen bei generischen Wildcard-Typen

Java-Wildcard-Generika bieten eine Möglichkeit, Typen darzustellen, ohne sich auf einen bestimmten konkreten Typ festzulegen. Obwohl diese Flexibilität sehr leistungsstark sein kann, kann sie auch zu unerwartetem Verhalten führen.

Betrachten Sie das folgende Beispiel, in dem eine Java-Liste eines unbekannten Untertyps der übergeordneten Schnittstelle definiert ist:

List<? extends Parent> list = ...;

Das Typsystem von Java erlaubt jedoch nicht das Hinzufügen einer übergeordneten Instanz zu dieser Liste:

Parent p = factory.get();   // returns concrete implementation
list.set(0, p);   // compilation error

Dieser scheinbare Widerspruch ergibt sich aus dem Konzept der Typsicherheit. Das Erlauben des Hinzufügens einer übergeordneten Instanz zur Liste würde die Integrität des generischen Wildcard-Typs gefährden. Hier ist der Grund:

Stellen Sie sich vor, dieser Zusatz wäre erlaubt. Angenommen, wir haben eine Liste von Child-Instanzen, die ein konkreter Untertyp von Parent sind:

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

Wenn wir diese ChildList unserer Liste mit dem generischen Wildcard-Typ zuweisen würden, würde es so aussehen, als hätten wir eine Liste der übergeordneten Instanzen:

List<? extends Parent> parentList = childList;

Allerdings könnten wir dann möglicherweise eine übergeordnete Instanz hinzufügen parentList:

parentList.set(0, new Parent());

Dies würde zu einer katastrophalen Sicherheitsverletzung führen. Wenn wir später das Element am Index 0 aus der ChildList abrufen, würden wir erwarten, dass es sich um eine Child-Instanz handelt, in Wirklichkeit wäre es jedoch eine Parent-Instanz, was zu unerwartetem Verhalten führen würde.

Um diese Art von Sicherheitsverletzung zu verhindern, Java erzwingt die Regel, dass Sie nur Instanzen des generischen Wildcard-Typs selbst zur Liste hinzufügen können, obwohl Sie Instanzen seines Supertyps abrufen können. Diese Einschränkung stellt die Integrität des Typparameters sicher und verhindert mögliche Fehler.

Das obige ist der detaillierte Inhalt vonWarum kann ich einer „Liste' keine „übergeordnete' Instanz 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