据推测,该方法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")
在尽可能低的级别使用,也可以在声明的位置使用,以消除编译器发出的任何未经检查的警告。
慕姐8265434
TA贡献1813条经验 获得超2个赞
在这里,T[]
is 在参数声明中,正如@Ravindra Ranwala 所回答的那样,声明类型的变量或参数T[]
非常好。它正在创建一个类型参数类型的数组,即new T[]
这是不允许的。
在这种情况下,通过传递给 varargs 参数,编译器实际上隐式地创建了一个类型的数组ArrayList<Integer>[]
来传递给方法。如您所知,new ArrayList<Integer>[]
也不允许创建参数化类型的数组,即。因此,编译器会创建new ArrayList[]
,并且通常情况下,您会在这样的调用中收到警告。但是,您在此调用中不会收到警告,因为Arrays.asList()
有@SafeVarargs
注释,表明它们不使用数组对象的运行时组件类型,因此是安全的。
添加回答
举报
0/150
提交
取消