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

如果 Java 不支持参数化类型数组,那么 Arrays.asList() 如何使用它们?

如果 Java 不支持参数化类型数组,那么 Arrays.asList() 如何使用它们?

守着星空守着你 2021-11-03 16:50:45
据推测,该方法Arrays.asList如下所示:public static <T> List<T> asList(T... a)T...实际上等同于T[],但是在 Java 中不是不允许使用泛型类型的数组吗?例如:// Example 1ArrayList<Integer>[] list = new ArrayList<Integer>[10];  // This is not allowed// Example 2List<ArrayList<Integer> > listOfList = Arrays.asList(new ArrayList<Integer>(), new ArrayList<Integer>());  // Allowed?在示例 2 中,我传递的两个参数意味着将Arrays.asList其ArrayList<Integer>[]作为与示例 1 相矛盾的参数。为什么示例 2 工作而示例 1 不起作用?
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您可以在 Java 中声明泛型类型数组,这是完全合法的。所以这应该有效。

private E[] array;

但是你不能像这样实例化一个泛型数组,因为数组是具体化的,并且所有的泛型类型都被实现为擦除。所以这个虚构的E在运行时不可用,你运气不好!

array = new E[10];  // Illegal and gives compiler error.

但是你在这里有一个解决方法。你能做的只是演员表。

array = (E[]) new Object[10];

通过这种方式,您可以在 java 中创建和实例化一个通用数组。您可以@SuppressWarnings("unchecked")在尽可能低的级别使用,也可以在声明的位置使用,以消除编译器发出的任何未经检查的警告。


查看完整回答
反对 回复 2021-11-03
?
慕姐8265434

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

在这里,T[]is 在参数声明中,正如@Ravindra Ranwala 所回答的那样,声明类型的变量或参数T[]非常好。它正在创建一个类型参数类型的数组,即new T[]这是不允许的。

在这种情况下,通过传递给 varargs 参数,编译器实际上隐式地创建了一个类型的数组ArrayList<Integer>[]来传递给方法。如您所知,new ArrayList<Integer>[]也不允许创建参数化类型的数组,即。因此,编译器会创建new ArrayList[],并且通常情况下,您会在这样的调用中收到警告。但是,您在此调用中不会收到警告,因为Arrays.asList()@SafeVarargs注释,表明它们不使用数组对象的运行时组件类型,因此是安全的。


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 168 浏览

添加回答

举报

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