通用的数组列表

时间:2010-08-04 07:27:30

标签: java generics

如何删除:

  

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

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

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

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

List arrayOfList[] = new List[10];

List[] arrayOfList = new List[10];

您不能在Java中使用通用数组,因此没有理由引用它。它不是类型安全的,因此警告。当然,您正在使用<Object>,这意味着您的列表旨在包含任何对象。但无法使用通用数组仍然适用。

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

答案 2 :(得分:1)

有很多方法:

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

答案 3 :(得分:1)

如果没有编译器警告,则无法对此进行任何变更。泛型和数组不好玩。虽然你可以用

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

答案 4 :(得分:0)

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

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

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

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

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