2014-06-20 62 views
0

我想有一些方法返回不同的可迭代像這樣一類:默認可迭代加上其他可迭代

public class MyClass<T extends Comparable<T>> { 
    ... 

    public Iterable<T> iterable1() { 
    return new Iterable1<T>(); 
    } 

    public Iterable<T> iterable2() { 
    return new Iterable2<T>(); 
    } 

    public Iterable<T> iterable3() { 
    return new Iterable3<T>(); 
    } 

} 

但我也想爲MyClass類默認可迭代(假設Iterable1)。 我知道我可以讓MyClass擴展Iterable並實現其中的默認策略,但我不想那樣做,因爲我想要一個乾淨的界面。

我希望能寫:

for(T t : myClass) //Here it should use Iterable1 
    //do something 

for(T t : myClass.iterable1()) //Here it should use Iterable1 again 
    //do something 

for(T t : myClass.iterable2()) //Here it uses Iterable2 
    //do something 

等。儘管如此,我想不出有多少模式可以完成這個任務。

回答

1

您的頂級課程需要實施Iterable。該Iterable接口定義了一個方法

Iterator<T> iterator(); 

這將爲你的情況「默認」的迭代器。

你的類將需要看起來有點像這樣:

public class MyClass<T extends Comparable<T>> implements Iterable<T> { 
    ... 

    Iterator<T> iterator() { 
    return new Iterable1<T>().iterator(); 
    } 

    public Iterable<T> iterable1() { 
    return new Iterable1<T>(); 
    } 

    public Iterable<T> iterable2() { 
    return new Iterable2<T>(); 
    } 

    public Iterable<T> iterable3() { 
    return new Iterable3<T>(); 
    } 

} 
+0

我在想用擴展的一些技巧。 MyClass擴展了Iterable1或類似的東西。 – Kami

1

如果你想這樣的工作:

MyClass myObject = ... 
    for (T t : myObject) { 
      .... 

然後MyClass必須實現Iterable<T>JLS 14.14.2說:

「的類型中的表達的必須是可迭代或陣列型(§10.1)或編譯時錯誤發生。」

其中「表達」指的是myObject


我知道我可以做MyClass的延伸(原文如此)可迭代並實現它裏面的默認策略,但我不想這樣做,因爲我希望有一個乾淨的界面。

對不起,但這在Java中是不可能的。往上看。


我想使用一些技巧與延伸。 MyClass擴展了Iterable1或類似的東西。

這實際上是一樣的製作MyClass實施Iterable ...假設Iterable1實現Iterable