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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (211)

据说,该方法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.asListArrayList<Integer>[]参数作为与示例1相矛盾的参数。为什么示例2在示例1不起作用时起作用?

提问于
用户回答回答于

可以在Java中声明一个完全合法的ageneric type数组。所以这应该工作。

private E[] array;

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

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

但是你有一个解决方法。你可以做什么只是一个演员。

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

这样您就可以在java中创建和实例化通用数组。您可以@SuppressWarnings("unchecked")在尽可能低的级别使用,可以在声明的站点上删除编译器发出的任何未经检查的警告。

用户回答回答于

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

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

扫码关注云+社区

领取腾讯云代金券