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]); }