首页  >  文章  >  Java  >  为什么我无法在 Java 中创建通用列表数组?

为什么我无法在 Java 中创建通用列表数组?

Barbara Streisand
Barbara Streisand原创
2024-11-03 17:24:30187浏览

Why Can't I Create an Array of Generic Lists in Java?

泛型数组和类型擦除之谜

使用泛型时,可能会令人困惑,为什么某些数组声明是允许的,而另一些则不允许't。请考虑以下事项:

ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine

此代码编译没有问题。然而,当涉及到通用列表的数组时:

ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error

编译器会抱怨。为什么会这样?

类型擦除的作用

这个问题源于Java中类型擦除的概念。编译泛型类型时,其类型参数将被删除并替换为原始类型。这意味着在运行时,所有泛型类型都被视为其相应的原始类型。

在第一个示例中,ArrayList;是一个泛型类型,但在运行时,它被视为 ArrayList。因此,a 可以保存具有 Key 类型元素的 ArrayList 对象。

但是,数组则不同。数组的每个元素必须具有相同的类型。因此,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中文网其他相关文章!

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