Java 1.6:创建 List<T> 数组

2022-09-01 08:55:05

为什么我不能创建一个 List 数组?

List<String>[] nav = new List<String>[] { new ArrayList<String>() };

Eclipse 说“无法创建 List 的通用数组”

ArrayList<String>[] nav = new ArrayList<String>[] { new ArrayList<String>() };

Eclipse 说“无法创建 ArrayList 的通用数组”

List<String>[] getListsOfStrings() {
    List<String> groupA = new ArrayList<String>();
    List<String> groupB = new ArrayList<String>();
    return new List<String>[] { groupA, groupB };
}

但我可以这样做:

List[] getLists() {
    return new List[] { new ArrayList(), new ArrayList() };
}

Eclipse说List和ArrayList是原始类型,但它编译...

看起来很简单,为什么它不起作用?


答案 1

好吧,泛型教程给出了你问题的答案。

数组对象的组件类型可能不是类型变量或参数化类型,除非它是(无界)通配符类型。可以声明其元素类型为类型变量或参数化类型的数组类型,但不能声明数组对象

可以肯定的是,这很烦人。此限制对于避免以下情况是必要的:

// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;

// Run-time error: ClassCastException.
String s = lsa[1].get(0);

如果允许参数化类型的数组,则前面的示例将在没有任何未经检查的警告的情况下进行编译,但在运行时会失败。我们将类型安全作为泛型的主要设计目标。


答案 2

通常,您无法创建泛型类型的数组。

原因是JVM没有办法检查是否只将正确的对象放入其中(使用ArrayStoreExceptions),因为和之间的差异在运行时不存在。List<String>List<Integer>

当然,您可以使用 原始类型 或 未绑定通配符类型 来欺骗编译器,然后将其强制转换(使用未经检查的强制转换)到 。但是,您有责任只放入其中,而不要放入其他列表。ListList<?>List<String>List<String>


推荐