【问题标题】:Generic List and Generic Array [duplicate]通用列表和通用数组
【发布时间】:2011-08-31 00:38:41
【问题描述】:

可能重复:
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
    }
}

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

【问题讨论】:

  • 我想我理解这个问题。如果由于类型擦除,new ArrayList&lt;X&gt;(); 本质上被视为new ArrayList&lt;Object&gt;();,为什么new X[10]; 不像new Object[10]; 那样处理? - 反之亦然,如果Java不能处理数组,它如何处理列表?
  • @Alan,谢谢。这就是我要问的。
  • @Lukas Eder ...我完全不同意这是一个重复的问题。我在问为什么我们可以创建一个通用列表实例而不是一个通用数组实例。

标签: java generics


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    在运行时没有已知类型X。这意味着您无法实例化该(未知类型)的数组。

    但是由于您不需要(实际上也不能使用)类型信息来在运行时创建参数化类型(同样:类型擦除),所以创建 ArrayList&lt;X&gt; 不是问题。

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

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多