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

如果Java没有';如果不支持参数化类型数组,那么arrays.asList()如何处理它们?,java,arrays,generics,Java,Arrays,Generics,据推测,方法Arrays.asList如下所示: public static <T> List<T> asList(T... a) 在示例2中,我传递的两个参数意味着Arrays.asList将ArrayList[]作为与示例1相矛盾的参数。为什么示例2可以工作而示例1不能工作?您可以用Java声明ageneric类型数组,这是完全合法的。所以这应该行得通 private E[] array; 但是不能像这样实例化泛型数组,因为数组是具体化的,所有泛型类型都实现为擦除

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

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

在示例2中,我传递的两个参数意味着
Arrays.asList
ArrayList[]
作为与示例1相矛盾的参数。为什么示例2可以工作而示例1不能工作?

您可以用Java声明ageneric类型数组,这是完全合法的。所以这应该行得通

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[]类型的变量或参数
非常好。它正在创建一个类型参数类型的数组,即不允许的
newt[]


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

因为
t[]
的实际类型是编译时类型的擦除。在这种情况下,实际参数将始终是
对象[]
。因此是否可以忽略“未经检查或不安全的操作”(编译这样的代码时收到的消息)?
array = (E[]) new Object[10];