2013-04-11 103 views
3

有些東西我缺少泛型和/或內部類。我想用專門的迭代器編寫一個專門的樹類。 FooTree類如何有一個迭代器來返回類型爲FooTree的連續節點而不是類型V的節點值?該類開始:類型不匹配:無法將MyClass <E>轉換爲MyClass <E>

public class FooTree<V> 
    private final V value; 
    private FooTree<V> left; 
    private FooTree<V> right; 

我將Iterator類作爲內部類,因爲沒有人會關心它。在FooTree定義獲得的迭代器工廠方法是:

public Iterator<FooTree<V>> preorderIterator() { 
    return this.new PreorderIterator<FooTree<V>>; 
} 

由於下一個()必須返回一個V,如在接口中聲明,我添加nextNode()來獲得周圍的返回類型。內部類開始:

private class PreorderIterator<V> implements Iterator<V> { 
    private FooTree<V> current; 
    . . . 
    public FooTree<V> nextNode() { 
     current = FooTree.this;      ** 

我得到這個美好的編譯器錯誤:
Type mismatch: cannot convert from ...FooTree<V> to ...FooTree<V>(兩者是相同的封裝)
誒!?WOT
我可以通過添加一個cast來編譯它:current =(FooTree)FooTree.this; 但是我爲什麼要首先呢? 它試圖成爲「聰明」,並計算出第一個V可能不同於第二個V?

這樣做的正確方法是什麼?

回答

5

嘗試使你的宣言:

private class PreorderIterator implements Iterator<V> 

<V>在你的內部類是不必要的,在這種情況下,無益的。

所發生的情況是,在PreorderIterator<V><V>從你的外部類「陰影」的<V>,這樣雖然它們看起來像它們是相同的類型參數,他們碰巧具有相同的實際不同的參數名稱。

+0

謝謝!一旦我放棄內心階層也需要明確參數化的偏見,我在探索時所得到的所有錯誤和提示都將落實到位。 – 2013-04-11 16:17:54

相關問題