如何在Java中创建通用数组列表?

时间:2011-06-15 13:22:57

标签: java arrays list generics

我编写了一个接受泛型类型的类,我正在尝试在其中创建泛型数组的数组列表。我理解Java can't create generic arrays,但我也知道there are workarounds。下面的代码有没有办法可行,或者我咆哮了错误的树?

public class IterableContainer<T extends IterableItem> {
    private T[] itemArray;

    // how can i get this following line to work?
    private List<T[]> items = new ArrayList<T[10]>();

    public IterableContainer() {  

... etc ...

忽略过去 - 结果证明这是一个IDE问题 留下问题和答案的连续性。

编辑:

这也不起作用:

private List<T[]> items = new ArrayList<T[]>();

错误:

  

令牌“&gt;”上的语法错误,此令牌后面的VariableDeclaratorId

5 个答案:

答案 0 :(得分:4)

它工作得很好,你不能使用T[10]声明,因为数组的长度不会影响它的类型。

... = new ArrayList<T[]>();

不是说它是一个好主意,但它应该可以像往常一样对通用数组进行相同的限制。在列表中创建 put 的内容会让你头疼。

答案 1 :(得分:4)

“......咆哮错误的树...... ,使用List<List<T>>。在Java中使用原始数组几乎总是代码味道,没有理由不使用适当的收集类。

答案 2 :(得分:1)

private List<T[]> items = new ArrayList<T[]>();

在我的机器上正常工作

当你说“我正在为移动设备开发”时......你的目标是j2me吗? j2metargetng

中不支持泛型

答案 3 :(得分:1)

这是java中的一个有效声明(根据规范),并且正如其他人评论的那样用javac编译得很好。

public class IterableContainer<T extends IterableItem> {
  private T[] itemArray;

  private List<T[]> items = new ArrayList<T[]>();// valid

  ..........  

}

我相信您看到的错误不是从Eclipse发出的,可能来自Eclipse中配置的Android SDK。如果在Eclipse中创建Java项目,则此代码应该可以正常工作。如果你在Eclipse的Android项目中使用它,你可能会遇到这个。从Android项目运行此代码时出现此错误:

#  guarantee(_name_index != 0 && _signature_index != 0) failed: bad constant pool index for fieldDescriptor

不幸的是,听起来你在Android项目中受到限制。

答案 4 :(得分:-1)

您尚未在此代码中定义T.

如果要创建泛型类,则需要编写:

public class <T extends IterableItem> IterableContainer...

您的代码中的下一个问题是您正在尝试在构造期间初始化ArrayList项。是不可能的。你应该写:

private List<T[]> items = new ArrayList<T[]>();