Java 1.6:创build一个List <T>的数组

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

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

Eclipse说“不能创buildList的通用数组”

要么

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

Eclipse说“不能创buildArrayList的通用数组”

要么

 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是原始types,但它编译…

看起来很简单,为什么不行?

那么, generics教程给你的问题的答案。

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

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

 // 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); 

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

通常,您不能创buildgenericstypes的数组。

原因在于JVM没有办法检查只有正确的对象被放入(使用ArrayStoreExceptions),因为List<String>List<Integer>之间的区别在运行时是不存在的。

当然,您可以通过使用原始typesList或未绑定的通配符typesList<?>来欺骗编译器,然后将其转换为List<String> (未经检查的转换)。 但是,这是你的责任,只有List<String>在其中,没有其他名单。

没有确切的答案,但提示:

最后一个例子有一个原始types警告,因为你省略了列表的types化; 通常是更好的(types安全的)方法来指定哪些对象types包含在列表中,这在前面的例子中已经做了( List<String>而不是List )。

使用数组不是最佳实践,因为它们的使用最多次包含错误; 使用集合类(List,Set,Map,…)可以使用types化和方便的方法来处理内容。 只要看一下Collections类的静态方法。

因此,只用前面的答案的例子。

另一个解决scheme是扩展LinkedList<String> (或ArrayList<String>等),然后创build一个子类的数组。

 private static class StringList extends LinkedList<String> {} public static void main(String[] args) { StringList[] strings = new StringList[2]; strings[0] = new StringList(); strings[1] = new StringList(); strings[0].add("Test 1"); strings[0].add("Test 2"); strings[1].add("Test 3"); strings[1].add("Test 4"); System.out.println(strings[0]); System.out.println(strings[1]); }