我编写了一个接受泛型类型的类,我正在尝试在其中创建泛型数组的数组列表。我理解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
答案 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[]>();