我正在编写一个有两个 ArrayList
的类字段。一种是用于包含自定义对象。另一个用于包含自定义集合对象(也可能具有这些字段):
private ArrayList<SomeClass> myObjList; // Just objects
private ArrayList<SomeCollectionClass> myCollectionList; // Collections of objects
为了落实Collection<E>
界面,我写了一个iterator()
方法:
public Iterator<SomeClass> iterator() { ... }
但作为一种方便的方法,我也开始编写一个 deepIterator() 来返回 Iterators
对于 myCollectionList
中的每个集合- Iterators
的集合- 事情很快就变得非常困惑:
public Iterator<SomeClass>[] deepIterator() {
int numIterators = this.myCollectionList.size();
Iterator<SomeClass>[] iters = (Iterator<SomeClass>[]) new Iterator<SomeClass>[numIterators]; // not allowed
for (int i = 0; i <= numIterators; i++) {
iters[i] = this.myCollectionList.get(i).iterator();
}
return iters;
}
并且编译器抛出 "generic array creation"
错误。我明白为什么会发生这种情况,但我不明白的是为什么:
public Iterator<SomeClass>[] deepIterator() {
int numIterators = this.myCollectionList.size();
Iterator<SomeClass>[] iters = (Iterator<SomeClass>[])(Array.newInstance(Iterator.class, numIterators)); // allowed
for (int i = 0; i <= numIterators; i++) {
iters[i] = this.myCollectionList.get(i).iterator();
}
return iters;
}
编译得很好。谁能解释一下吗?我并不真正关心 array[]
的优点与一些Collection<E>
类( ArrayList
或者你有什么)作为返回类型,我只是对那个声明/实例化/初始化行感到困惑。提前致谢!
最佳答案
如果您像这样声明第二个项目会有帮助吗?
private ArrayList<Collection<SomeClass>> myCollectionList;
处理数组和迭代器看起来像是 a$$ 中的一个痛苦。我之前已经使用像这样的泛型将集合嵌套在集合中,并且效果很好。然后,我只需使用普通的集合 API 调用,在嵌套的 for
循环中对其进行迭代。
关于java - 通用数组创建与 Array.newInstance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731612/