首页 >Java >java教程 >为什么对列表引用使用原始类型会妨碍通用方法的使用?

为什么对列表引用使用原始类型会妨碍通用方法的使用?

Patricia Arquette
Patricia Arquette原创
2024-11-11 22:38:02550浏览

Why Does Using a Raw Type for a List Reference Prevent Generic Method Usage?

组合原始类型和泛型方法

考虑以下代码片段:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn