【问题标题】:Generic List of Array数组的通用列表
【发布时间】:2011-03-25 02:59:22
【问题描述】:

如何删除:

类型安全:类型的表达 List[] 需要未经检查的转换才能符合List<Object>[]

以下表达式中的编译器警告:

List<Object>[] arrayOfList = new List[10];

【问题讨论】:

    标签: java generics


    【解决方案1】:

    Afaik 唯一的方法是使用@SuppressWarnings("unchecked")。至少如果您想避免 Matthew 的回答中出现的原始类型警告。

    但您应该重新考虑您的设计。列表数组?这真的有必要吗?为什么不是列表列表?如果它变得太复杂(List of List of List to ...),请使用自定义数据类型。这确实使代码更具可读性。

    作为一个无关的旁注:你应该写List&lt;Object&gt;[] arrayOfList。括号是类型的一部分,而不是变量。

    【讨论】:

      【解决方案2】:

      如果没有编译器警告,您不能对此进行任何变体。泛型和数组表现不佳。虽然你可以用

      压制它
      @SuppressWarnings("unchecked")
      final List<Object> arrayOfList[] = new List[10];
      

      【讨论】:

        【解决方案3】:
        List arrayOfList[] = new List[10];
        

        List[] arrayOfList = new List[10];
        

        Java 中不能有泛型数组,因此没有理由引用一个。它不是类型安全的,因此会发出警告。当然,您使用的是&lt;Object&gt;,这意味着您的列表旨在包含任何对象。但是无法拥有泛型数组仍然适用。

        另外,请注意上面的第二个版本(带有 [] 附加到类型)在 Java 中通常被认为是更好的样式。它们在语义上是等价的。

        【讨论】:

          【解决方案4】:

          有很多方法:

          1. 您可以在赋值前添加`@SuppressWarnings("unchecked") 告诉编译器忽略警告
          2. 使用原始类型List[] arrayOfList = new List[10]; 请注意,在 Java 中,您通常在声明类型时将 [] 放在类型而不是变量之后 - 尽管 Sun 不鼓励使用原始类型,因为它们可能会在未来的版本中被删除。
          3. 不要使用数组,将集合与数组混合通常是个坏主意:List&lt;List&lt;Object&gt;&gt; listOfList = new ArrayList&lt;List&lt;Object&gt;&gt;;

          【讨论】:

            【解决方案5】:

            不幸的是,由于泛型是在 Java 中使用 type erasure 实现的,因此您无法创建具有类型参数的类型数组:

            // This will give you a compiler error
            List<Object>[] arrayOfList = new ArrayList<Object>[10];
            

            有关详细说明,请参阅 Angelika Langer 的 Java 泛型常见问题解答中的 this

            您可以删除泛型并使用原始类型,如 Matthew Flaschen 所示,或者使用集合类而不是数组:

            List<List<Object>> data = new ArrayList<List<Object>>();
            

            【讨论】:

            • -1。我的代码编译是因为我在这里实例化一个数组而不是一个列表。
            • 好吧,你是对的。我的错。编辑了答案。但这里要理解的重要一点是,您不能创建参数化类型的数组。
            猜你喜欢
            • 1970-01-01
            • 2011-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-06
            • 2016-03-23
            • 2011-09-26
            • 1970-01-01
            相关资源
            最近更新 更多