In Java, using raw types can lead to unexpected consequences when interacting with generic methods.
Consider the following code snippet:
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
This code compiles successfully in both JDK 1.6 and JDK 1.7. However, if we declare the List reference as a raw type:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
We encounter a compiler error indicating that a String[] is required but an Object[] was found.
This behavior stems from the fact that using a raw type for the List reference removes the ability to use generics for instance members of that type. This is not limited to generic methods, as the following example shows:
public class MyContainer<T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<Integer>(); List<String> strings = container.strings(); // gives an unchecked warning!
This behavior is stated explicitly in the Java Language Specification (JLS):
The type of a constructor (§8.8), instance method (§8.4, §9.4), or non-static field (§8.3) M of a raw type C that is not inherited from its superclasses or superinterfaces is the raw type that corresponds to the erasure of its type in the generic declaration corresponding to C.
Therefore, using raw types should be done with caution, as it can lead to unexpected limitations and even compile-time errors when using generic methods or accessing instance members.
The above is the detailed content of Why Do Raw Types Cause Problems When Working with Generic Methods in Java?. For more information, please follow other related articles on the PHP Chinese website!