Java 1.6:创建List <T>的数组

为什么不能创建List数组?


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

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


要么


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是原始类型,但可以编译...


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


冉冉说
浏览 1301回答 3
3回答

撒科打诨

好吧,泛型教程为您的问题提供了答案。数组对象的组件类型不能是类型变量或参数化类型,除非它是(无界)通配符类型。您可以声明其元素类型是类型变量或参数化类型的数组类型,但不能声明数组对象。当然,这很烦人。为避免出现以下情况,必须使用此限制:// 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 checkoa[1] = li;// Run-time error: ClassCastException.String s = lsa[1].get(0);如果允许使用参数化类型的数组,则前面的示例将在编译时没有任何未经检查的警告,但在运行时会失败。我们已经将类型安全性作为泛型的主要设计目标。

守候你守候我

通常,您不能创建泛型类型的数组。其原因是,在JVM有没有办法检查,只有正确的对象放入它(与ArrayStoreExceptions),因为之间的差异List<String>,并List<Integer>在运行时不存在的。当然,您可以使用原始类型List或未绑定的通配符类型来欺骗编译器List<?>,然后将其(使用未经检查的类型转换)转换为List<String>。但是,您有责任仅将其放在List<String>其中,而不能放入其他列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java