java - 通用数组创建与 Array.newInstance()

标签 java arrays generics iterator

我正在编写一个有两个 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/

相关文章:

java - 为什么 Java 允许将原始 List 传递给通用 List 构造函数?

java - Spring batch FileItemWriter 没有在正确的路径创建文件

java - 公共(public)接口(interface) BaseRepository 扩展 JpaRepository<Category, Long>{ }

java - 如何将某些内部类的类类型从 Java 源传递到 Scala?

java - 获取异常 : "AWT-EventQueue-0" java. lang.NullPointerException

在 C 中反转 char 数组的二进制值的最干净方法?

java - 给予泛型的正确方法是什么?

java - Java 中搜索方法的空指针异常

java - 基于对象属性对 ArrayList 进行排序

java - 将 Java 泛型类型与函数式接口(interface)一起使用时出现编译错误