Casting von Iterable? zu IterableObject immer sicher?

8

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.

    
maaartinus 17.10.2013, 18:14
quelle

2 Antworten

4

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.

    
maaartinus 17.10.2013, 18:37
quelle
6

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).

    
yshavit 17.10.2013 18:17
quelle

Tags und Links