泛型数组和类型擦除之谜
使用泛型时,可能会令人困惑,为什么某些数组声明是允许的,而另一些则不允许't。请考虑以下事项:
ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine
此代码编译没有问题。然而,当涉及到通用列表的数组时:
ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error
编译器会抱怨。为什么会这样?
类型擦除的作用
这个问题源于Java中类型擦除的概念。编译泛型类型时,其类型参数将被删除并替换为原始类型。这意味着在运行时,所有泛型类型都被视为其相应的原始类型。
在第一个示例中,ArrayList
但是,数组则不同。数组的每个元素必须具有相同的类型。因此,ArrayList
修复问题
要解决此问题,可以将数组转换为显式原始类型:
ArrayList<Key>[] a = (ArrayList<Key> []) new ArrayList[10];
此转换本质上告诉编译器我们需要一个原始 ArrayList 对象数组,这是一个有效的类型。
使用嵌套列表
另一种选择是使用列表的列表:
ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();
在这种情况下,b 是 ArrayList 对象的列表,其中每个 ArrayList 可以保存 Key 类型的元素。这种方法是合法的,因为 ArrayList 不是数组类型。
其他信息
有关此主题的更多见解,请参阅官方 Java 教程的第 7.3 章。它解释了数组类型如何不能将类型变量作为其组件,除非它们是通配符类型。
以上是为什么我无法在 Java 中创建通用列表数组?的详细内容。更多信息请关注PHP中文网其他相关文章!