使用Iterator迭代列表时的StackOverflowError

时间:2018-03-06 23:24:08

标签: java iterator

我正在尝试在列表上实现toArray()方法。最初我得到一个错误,说我只能在使用for循环时迭代数组或java.lang.iterable的实例,所以我做了一些研究并尝试使用Iterator。但是,现在它看起来像是一个像递归循环(我认为)的东西。以下是我遇到问题的代码部分:

public Object[] toArray(){
    Object[] arr = new Object[this.size()]
    int i = 0;
    for(E e: this){
        arr[i] = e;
        i++;
    }
    return arr;
}

@Override
public Iterator<E> iterator() {
    return this.iterator();
}

我已经将其缩小到如何定义我的public Iterator<E> iterator()方法,因为如果我在foreach循环中使用其他值而不是this,则程序正常工作。我得到的错误是 Exception in thread "main"java.lang.StackOverflowError at arrayIndexList.ArrayIndexList.iterator(ArrayIndexList.java:158)一遍又一遍地重复,但不是在无限循环中,因为它终止了。当我点击ArrayIndexList.java:158时,我会转到代码中的return this.iterator()。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

首先,您需要将Class<E>传递给构造函数并保存,以便您可以在toArray()中正确构建数组类型 - 并返回E[]。然后你可以用List包裹它并返回iterator()。像,

private Class<E> cls; // <-- make sure you assign this in your constructor

public E[] toArray() {
    E[] arr = Array.newInstance(cls, this.size()); // <-- here is how you get an E[]
    int i = 0;
    for (E e : this) {
        arr[i] = e;
        i++;
    }
    return arr;
}

@Override
public Iterator<E> iterator() {
    return Arrays.asList(this.toArray()).iterator();
}