Java 泛型列表和泛型数组
可能重复:Java 泛型列表和泛型数组,java,generics,Java,Generics,可能重复: 我有以下代码: class B<X> { public void create() { List<X> l1 = new ArrayList<X>(); //No ERROR X[] arrr = new X[10]; //ERROR } } B类 { 公共void create() { 列表l1=新的ArrayList();//无错误 X[]arrr=new X[10];//错误
我有以下代码:
class B<X>
{
public void create()
{
List<X> l1 = new ArrayList<X>(); //No ERROR
X[] arrr = new X[10]; //ERROR
}
}
B类
{
公共void create()
{
列表l1=新的ArrayList();//无错误
X[]arrr=new X[10];//错误
}
}
我知道由于类型擦除,我无法实例化泛型数组。但是为什么我可以实例化泛型列表的实例呢?原因是泛型是使用类型擦除实现的: 运行时不知道类型
X
。这意味着您不能实例化该类型的数组(未知类型)
但是,由于在运行时创建参数化类型时不需要(实际上也不能使用)类型信息(同样是:类型擦除),因此创建ArrayList
不是问题
请注意,在内部,无论类型参数是什么,
ArrayList
始终使用对象[]
进行实际存储。Angelika Langer提供了有关Java泛型的优秀文档。此链接回答了有关列表(和其他泛型类型)与数组之间的差异以及为什么不能以这种方式实例化数组的问题:
简而言之:因为数组是协变的,所以实例化参数化类型的数组是不安全的。or()的可能重复我想我理解这个问题。如果
新建ArrayList()
本质上被视为new ArrayList()代码>由于类型擦除,为什么是新的X[10]代码>不像新对象[10]那样处理代码>?-反之亦然,如果Java不能处理数组,它如何处理列表?@Alan,谢谢。这就是我要问的。@Lukas Eder…我完全不同意这是一个重复的问题。我在问为什么我们可以创建一个泛型列表实例而不是泛型数组实例。