通用列表和通用数组

时间:2011-05-23 09:40:36

标签: java generics

  

可能重复:
  What is the easiest alternative to a generic array in Java?

我有以下代码:

class B<X>
{
    public void create()
    {
        List<X> l1 = new ArrayList<X>(); //No ERROR

        X[] arrr = new X[10];   //ERROR
    }
}

我知道由于类型擦除,我无法实例化Generic数组。但为什么我可以实例化一个通用List的实例?

2 个答案:

答案 0 :(得分:5)

原因是使用类型擦除来实现泛型:

运行时不知道类型X。这意味着您无法实例化该数组(未知类型)。

但是,由于您不需要(实际上不能使用)用于在运行时创建参数化类型的类型信息(再次:类型擦除),因此创建ArrayList<X>不是问题。

请注意,无论类型参数是什么,ArrayList 总是在内部使用Object[]进行实际存储。

答案 1 :(得分:0)

Angelika Langer提供了有关Java泛型的优秀文档。此链接回答了有关列表(和其他泛型类型)和数组之间的区别以及为什么无法以这种方式实例化数组的问题:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ104

简而言之:因为数组是协变的,所以不是类型安全来实例化参数化类型的数组。