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
Freigeben: 2024-11-30 19:34:11
Original
934 Leute haben es durchsucht

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 = ...;
Nach dem Login kopieren

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
Nach dem Login kopieren

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());
Nach dem Login kopieren

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;
Nach dem Login kopieren

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

parentList.set(0, new Parent());
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage