2017-07-06 123 views
1

我想用迭代器來使用我的自定義類,但它不能在使用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 == 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並不適用於我喜歡的類型。

+11

一個類必須實現Iterable接口才能在for-each塊中使用。 –

+2

不相關,但不要將通用類型參數命名爲「Double」。它非常容易混淆,看到的類型爲'Double',它不是'java.lang.Double',但可以是任何東西,例如'Fruit'。 [命名約定](https://stackoverflow.com/documentation/java/2697/oracle-official-code-standard/9031/naming-conventions#t=201707061649005848894)對於類型變量通常使用單個大寫字母,最常見的是'T'。在你的情況下,「元素」的「E」是另一個合適的名字。 – Andreas

回答

6

您的班級FCSOfOtherClass未執行java.lang.Iterable。 「foreach」循環僅適用於Iterable的數組和實例。

您可以通過你的類實現Iterable解決這個問題:

public class FCSOfOtherClass implements java.lang.Iterable<Double> { 
    ... 
} 

這就需要你提供的接口方法iterator()的實現。你的示例代碼表明你已經這樣做了:

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

這是覆蓋在Java語言規範,section 14.14.2: The enhanced for statement

類型的表達必須是可迭代或數組類型(§10.1)或發生編譯時錯誤。

+1

有趣的是,他做了一切*幾乎*正確 - 他忘了實際上宣佈他的類實現了'Iterable'接口;) –

相關問題