如果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];