Community
Participate
Working Groups
I20050331-2000 Consider this snippet: package generics2; import java.util.List; public class Casts { void foo(List<Object> objects, List raw) { List<Number> numbers; List<? extends Number> ext; numbers= (List<Number>) objects; // correct - cast error ext= (List<? extends Number>) objects; // wrong, should fail ext= raw; // correct - raw conversion warning issued numbers= raw; // correct - raw conversion warning issued } } - the snippet compiles with eclipse. On the second assignment it issues a "check against erased type" warning, but it should fail. Javac output follows: ------- javac ------------ javac 1.5.0 /opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:11: inconvertible types found : java.util.List<java.lang.Object> required: java.util.List<java.lang.Number> numbers= (List<Number>) objects; ^ /opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:12: inconvertible types found : java.util.List<java.lang.Object> required: java.util.List<? extends java.lang.Number> ext= (List<? extends Number>) objects; ^ /opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:14: warning: [unchecked] unchecked conversion found : java.util.List required: java.util.List<? extends java.lang.Number> ext= raw; ^ /opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:15: warning: [unchecked] unchecked conversion found : java.util.List required: java.util.List<java.lang.Number> numbers= raw; ^ 2 errors 2 warnings
According to JLS-5.5 (3rd edition), cast is ok if List<? extends Number> and List<Object> are provably distinct (JLS-4.5.1). But I agree here that the types are distinct, and cast should fail.
Indeed the spec allows this scenario as unchecked cast. Closing as a javac bug.
Added GenericTypeTest#test666. Scary number.
The spec is being revised to be stricter near cast conversion. Reopening.
If tightening the rules, I would obtain: ---------- 1. WARNING in X.java (at line 3) void foo(List<Object> objects, List raw) { ^^^^ List is a raw type. References to generic type List<E> should be parameterized ---------- 2. ERROR in X.java (at line 8) numbers= (List<Number>) objects; // correct - cast error ^^^^^^^^^^^^^^^^^^^^^^ Cannot cast from List<Object> to List<Number> ---------- 3. ERROR in X.java (at line 9) ext= (List<? extends Number>) objects; // wrong, should fail ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cannot cast from List<Object> to List<? extends Number> ---------- 4. WARNING in X.java (at line 11) ext= raw; // correct - raw conversion warning issued ^^^ Type safety: The expression of type List needs unchecked conversion to conform to List<? extends Number> ---------- 5. WARNING in X.java (at line 12) numbers= raw; // correct - raw conversion warning issued ^^^ Type safety: The expression of type List needs unchecked conversion to conform to List<Number> ---------- 5 problems (2 errors, 3 warnings)
Released for 3.4M3. Fixed Also see bug 158870 for combined patch.
Verified for 3.4 M3 using build I20071029-0010.