为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

冉冉说 2019-10-21 10:10:11
为什么不能创建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是原始类型,但可以编译...看起来很简单,为什么不起作用?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

好吧,泛型教程为您的问题提供了答案。


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


当然,这很烦人。为避免出现以下情况,必须使用此限制:


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

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


查看完整回答
反对 回复 2019-10-21
?
守候你守候我

TA贡献1802条经验 获得超10个赞

通常,您不能创建泛型类型的数组。

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

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


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 1300 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信