考虑以下代码片段:
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
此代码在 Java 6 和 7 中都能成功编译。但是,如果 List 引用被声明为原始类型:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
它会导致编译器错误,指出需要 String[],但找到了 Object[]。此行为是意外的,因为 toArray 方法签名为:
<T> T[] toArray(T[] a);
,这表明该方法是参数化的,并且其类型参数与 List 的类型参数无关。
要理解为什么此代码无法编译,重要的是要注意,对实例引用使用原始类型会使对其任何实例成员使用泛型的能力无效。此行为不限于泛型方法,如以下代码片段所示:
public class MyContainer<T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<Integer>(); List<String> strings = container.strings(); // This line will produce an unchecked warning!
Java 语言规范 (4.8) 中指定了此限制:
“构造函数的类型不是从其超类或超接口继承的原始类型 C 的实例方法或非静态字段 M 是与 C 对应的泛型声明中其类型擦除相对应的原始类型。”
以上是为什么对列表引用使用原始类型会妨碍通用方法的使用?的详细内容。更多信息请关注PHP中文网其他相关文章!