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

据推测,该方法Arrays.asList如下所示:


public static <T> List<T> asList(T... a)

T...实际上等同于T[],但是在 Java 中不是不允许使用泛型类型的数组吗?例如:


// Example 1

ArrayList<Integer>[] list = new ArrayList<Integer>[10];  // This is not allowed


// Example 2

List<ArrayList<Integer> > listOfList = Arrays.asList(new ArrayList<Integer>(), new ArrayList<Integer>());  // Allowed?

在示例 2 中,我传递的两个参数意味着将Arrays.asList其ArrayList<Integer>[]作为与示例 1 相矛盾的参数。为什么示例 2 工作而示例 1 不起作用?


守着星空守着你
浏览 169回答 2
2回答

哔哔one

您可以在 Java 中声明泛型类型数组,这是完全合法的。所以这应该有效。private&nbsp;E[]&nbsp;array;但是你不能像这样实例化一个泛型数组,因为数组是具体化的,并且所有的泛型类型都被实现为擦除。所以这个虚构的E在运行时不可用,你运气不好!array&nbsp;=&nbsp;new&nbsp;E[10];&nbsp;&nbsp;//&nbsp;Illegal&nbsp;and&nbsp;gives&nbsp;compiler&nbsp;error.但是你在这里有一个解决方法。你能做的只是演员表。array&nbsp;=&nbsp;(E[])&nbsp;new&nbsp;Object[10];通过这种方式,您可以在 java 中创建和实例化一个通用数组。您可以@SuppressWarnings("unchecked")在尽可能低的级别使用,也可以在声明的位置使用,以消除编译器发出的任何未经检查的警告。

慕姐8265434

在这里,T[]is 在参数声明中,正如@Ravindra Ranwala 所回答的那样,声明类型的变量或参数T[]非常好。它正在创建一个类型参数类型的数组,即new T[]这是不允许的。在这种情况下,通过传递给 varargs 参数,编译器实际上隐式地创建了一个类型的数组ArrayList<Integer>[]来传递给方法。如您所知,new ArrayList<Integer>[]也不允许创建参数化类型的数组,即。因此,编译器会创建new ArrayList[],并且通常情况下,您会在这样的调用中收到警告。但是,您在此调用中不会收到警告,因为Arrays.asList()有@SafeVarargs注释,表明它们不使用数组对象的运行时组件类型,因此是安全的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java