MyEntity
ist eine Markierungsschnittstelle.
Der obige Code funktioniert in java-7 (java Version "1.7.0_91", um genau zu sein), aber nicht in Java-8 (Java-Version "1.8.0_77")
In Java8 erhalte ich die folgende Ausnahme:
incompatible types: ArrayList<Object> cannot be converted to List< ? extends MyEntity>
Ihr Code sollte weder in Java 7 noch in Java 8 funktionieren, weil Sie versuchen, ein ArrayList<Object>
(vom Konstruktor zurückgegebener Typ) in ein List<? extends MyEntity>
umzuwandeln, und das hat selbst zur Kompilierzeit keinen Sinn (siehe < a href="https://stackoverflow.com/questions/8481301/covariance-invariance-and-contravariance-explained-in-plain-english"> diese Frage ). Deshalb beschwert sich der Compiler.
Der folgende Code wird kompiliert:
%Vor%Der Compiler wird jedoch eine Warnung ausgeben, da Sie eine unsichere Konvertierung durchführen.
EDIT: Wie @Tom darauf hinweist:
"Dein Code sollte nicht in Java 7 funktionieren" Das sollte nicht funktionieren, aber es hat funktioniert, weil die Compiler-Prüfungen in dieser Version immer noch ein bisschen fehlerhaft waren. Dies wurde in Java 8 behoben, deshalb schlägt es jetzt fehl.
Java 8 hat sich sehr verändert bezüglich Typinferenz und verwandten Themen. Daher ist es nicht überraschend, wenn einige Randfälle (z. B. Schattenwurf) plötzlich ungültig werden.
Was auch immer der Grund ist, du kannst deine Liste immer noch werfen, aber sie ist etwas hässlicher als zuvor:
(List<? extends MyEntity>) (List) new ArrayList<>(removedObjs);
Wie Peter Lawreys Kommentar darauf hingewiesen hat, kann dies noch kürzer geschrieben werden als
(List) new ArrayList<>(removedObjs);