Probleme beim Hinzufügen von Werten zu Java-Sammlungen mit generischen Wildcard-Typen
Betrachten Sie den folgenden Code, bei dem Parent eine Schnittstelle ist:
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 schlägt dieser Code fehl?
Das Problem liegt in der Verwendung des Generischer Wildcard-Typ? erweitert Parent. Diese Syntax gibt an, dass die Liste Objekte jedes Typs enthalten kann, der Parent erweitert. Dies bietet zwar Flexibilität, erhöht aber auch ein gewisses Maß an Unsicherheit hinsichtlich der tatsächlichen Art der Objekte in der Liste.
Um zu verstehen, warum der Code fehlschlägt, betrachten Sie das folgende Szenario:
List<Child> childList = new ArrayList<Child>(); 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...
Die Platzhaltertyp ? erweitert Parent ermöglicht es uns, die childList der parentList zuzuweisen. Wenn wir jedoch versuchen, ein Objekt vom Typ Parent in der ParentList festzulegen, kann der Compiler nicht garantieren, dass das entsprechende Objekt in der ChildList auch vom Typ Child ist. Dies könnte zu einem Laufzeitfehler oder unerwartetem Verhalten führen.
Um die Typsicherheit aufrechtzuerhalten, schränkt der Compiler die Vorgänge ein, die für eine Sammlung mit einem generischen Platzhaltertyp ausgeführt werden können. In diesem Fall ist die Zuweisung eines Objekts zur Liste verboten, da der Compiler die Kompatibilität des Objekts mit dem unbekannten Typ der Liste nicht garantieren kann.
Das obige ist der detaillierte Inhalt vonWarum kann ich einer Java-Sammlung keine Werte mit einem generischen Wildcard-Typ wie „ hinzufügen? erweitert Parent`?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!