2009-08-17 55 views
4

我有一個泛型類。它包含了一個對象,並判令:定製的Java迭代器類型混亂

public class OrderedObject<T> { 
    private int order; 
    private T object; 

    public OrderedObject(int order, T object) { 
     this.order = order; 
     this.object = object; 
    } 

    public int getOrder() { 
     return order; 
    } 

    public T getObject() { 
     return object; 
    } 
} 

我開發了一個Set實現存儲OrderedObject<T>情況,並希望產生Iterator<T>枚舉通過強制執行的順序內置的順序:

public class OrderedObjectSet<T> extends AbstractSet<T> implements Set<T> { 
    Set<OrderedObject<T>> s = new HashSet<OrderedObject<T>>(); 

    public boolean add(int order, T object) { 
     return s.add(new OrderedObject<T>(order, object)); 
    } 

    public Iterator<T> iterator() { 
     return new OrderedObjectSetIterator<T>(); 
    } 

    public int size() { 
     return s.size(); 
    } 

    private class OrderedObjectSetIterator<T> implements Iterator<T> { 
     private int index; 

     public boolean hasNext() { 
      return index < s.size(); 
     } 

     public T next() { 
      T object = null; 

      for (Iterator<OrderedObject<T>> it = s.iterator(); it.hasNext();) { 
       OrderedObject<T> o = it.next(); 
       if (o.getOrder() == index) { 
        object = o.getObject(); 
       } 
      } 

      index++; 
      return object; 
     } 

     public void remove() { 
      throw new UnsupportedOperationException(); 
     } 
    } 
} 

後者類沒有編譯,因爲那裏

似乎在 Iterator初始化類型的一些混亂
for (Iterator<OrderedObject<T>> it = s.iterator(); it.hasNext();) { 

我忽略了什麼?

+3

您知道'TreeSet'的,對不對? – 2009-08-17 21:41:42

+0

無論如何,我沒有一個方便的編譯器,但是如果將內部類定義爲'private class OrderedObjectSetIterator implements Iterator '會發生什麼?我認爲'T'可能會在那裏得到重新定義。 – 2009-08-17 21:43:25

+0

以擴展MMyers的評論,如果您使用TreeSet並將您的OrderedObject定義爲compareTo()以使用訂單字段,那麼您可以獲得更高效的免費迭代器.... – 2009-08-17 21:44:46

回答

5

這個混淆是因爲內部類OrderedObjectSetIterator引入了一個與外部類相同的泛型(T)。 Eclipse IDE中顯示一個警告:

The type parameter T is hiding the type T 

所以我猜你並不需要引入另一個參數類型,只需使用相同外類定義。

基本上,內部類將被定義爲:

private class OrderedObjectSetIterator implements Iterator<T> { 
.... 

而iterator方法爲:

public Iterator<T> iterator() { 
    return new OrderedObjectSetIterator(); 
} 
+0

這正是錯誤的地方。 我不需要其他參數類型。 謝謝。 解決。 我覺得建議的TreeSet方法是更優雅的解決方案。無論如何,我很高興通過實驗這個本土的Set來獲得對泛型的見解。 Bart – 2009-08-18 20:53:44