Ist Casting von Iterable<?>
auf Iterable<Object>
immer sicher?
Es sieht so aus, als ob es ist, da ich keinen Weg sehe, wie man es missbrauchen kann, um ein unerwartetes ClassCastException
zu erzeugen, aber ich denke, dass mir etwas fehlt.
Jetzt weiß ich, was mich gestört hat:
%Vor%So ist die Besetzung sicher, solange du nicht nach oben kommst und das unsichere Ding nicht entkommen lässt.
Im Falle von Iterable
, ja, da es keine Methoden gibt, die ein T
verwenden, nur Methoden, die ein T
(na ja, über seinen Iterator) zurückgeben. BEARBEITEN : Siehe unten.
Java hat kein formales Konzept von kovarianten Klassen gegen kontravariante Klassen, weshalb es nicht zwischen einem Iterable<T>
und einem List<T>
unterscheiden kann (letzteres ist nicht ) sicher zu übertragen von List<?>
bis List<Object>
). Da es diese Unterscheidung nicht hat, ist es gezwungen, Sie zu warnen, dass die Besetzung potenziell unsicher ist. Denn unsicher bedeutet nicht, dass Dinge werden , es bedeutet nur, dass der Compiler nicht garantieren kann, dass nicht ist.
BEARBEITEN: maaartinus hat ein gutes Gegenbeispiel gefunden. Das Obige ist nur wahr, wenn das Iterable unveränderlich ist; aber natürlich sind unveränderliche Typen sowieso kovariant (auch wenn Java das nicht erkennt, da es Unveränderlichkeit nicht erkennt).