Java 为什么我不能在课堂上使用foreach?

Java 为什么我不能在课堂上使用foreach?,java,foreach,Java,Foreach,我试图将我的自定义类与迭代器一起使用,但它无法使用foreach对元素进行迭代。我该怎么处理呢 public class FCSOfOtherClass<Double> { private int n; private Double[] a; public FCSOfOtherClass(int cap) { a = (Double[]) new Object[cap]; } public void push(Double dou) { if (a.length

我试图将我的自定义类与迭代器一起使用,但它无法使用foreach对元素进行迭代。我该怎么处理呢

public class FCSOfOtherClass<Double> {
private int n;
private Double[] a;

public FCSOfOtherClass(int cap) {
    a = (Double[]) new Object[cap];
}

public void push(Double dou) {
    if (a.length == n) {
        this.resize(2 * a.length);
        a[n++] = dou;
    } else {
        a[n++] = dou;
    }
}

private void resize(int max) {
    Double[] newa = (Double[]) new Object[max];
    for (int i = 0; i < n; i++) {
        newa[i] = a[i];
        a = newa;
    }
}

public Boolean isEmpty() {
    return n == 0;
}

public Double pop() {
    Double dou = a[--n];
    a[n] = null;
    if (n > 0 && n == a.length / 2) {
        resize(a.length / 2);
    }
    return dou;
}

public int size() {
    return n;
}

public Iterator<Double> iterator() {
    return new RAIterator();
}

private class RAIterator implements Iterator<Double> {
    private int i = n;

    @Override
    public boolean hasNext() {
        return i > 0;
    }

    @Override
    public Double next() {
        return a[--i];
    }

    @Override
    public void remove() {

    }

    @Override
    public void forEachRemaining(Consumer<? super Double> action) {

    }
这是我的主要方法:

public static void main(String[] args) {
    FCSOfOtherClass<Integer> fcs = new FCSOfOtherClass<>(100);
    int i = 0;
    while (!StdIn.isEmpty()) {
        fcs.push(++i);
    }
    for (int j:fcs) {
        StdOut.print(j);
    }
}
运行此命令时,我收到一个错误,告诉我foreach不适用于我的类型。

您的类FCSoOtherClass未实现java.lang.Iterable。foreach循环仅适用于Iterable的数组和实例

您可以通过使类实现Iterable来解决此问题:

Java语言规范中介绍了这一点:

表达式的类型必须是Iterable或数组类型§10.1,否则会发生编译时错误

您的类FCSOOtherClass未实现java.lang.Iterable。foreach循环仅适用于Iterable的数组和实例

您可以通过使类实现Iterable来解决此问题:

Java语言规范中介绍了这一点:

表达式的类型必须是Iterable或数组类型§10.1,否则会发生编译时错误


类必须实现Iterable接口才能在for each block.Unrelated中使用,但不能将泛型类型参数命名为Double。看到Double类型的变量是非常混乱的,它不是java.lang.Double,但可以是任何东西,例如水果。for类型变量通常使用单个大写字母,最常见的是T。在您的情况下,E for元素将是另一个合适的名称。类必须实现Iterable接口才能在for每个块中使用。不相关,但不要将泛型类型参数命名为双精度。看到Double类型的变量是非常混乱的,它不是java.lang.Double,但可以是任何东西,例如水果。对于类型变量,通常使用一个大写字母,最常见的是T。在您的情况下,元素的E将是另一个合适的名称。有趣的是,他几乎做对了所有事情——他只是忘记了实际声明他的类实现了Iterable接口;有趣的是,他做的每件事几乎都是对的——他只是忘记了实际上声明他的类实现了Iterable接口;
public class FCSOfOtherClass implements java.lang.Iterable<Double> {
    ...
}
public Iterator<Double> iterator() {
    return new RAIterator();
}