2014-12-18 15 views
2

我試圖編寫一個可迭代的接口並支持多個抽象層次。我無法正確定義界面。在泛型迭代中支持接口和類

我已經聲明瞭以下接口和類(玩具爲例):

public interface A {} 

public class B implements A {} 

public interface C <T extends A> extends Iterable<T> {} 

public class D implements C<B> { 
    public Iterator<B> iterator() { ... } 
} 

以下工作:

D d = new D(); 
for (A a : d) {} 
for (B b : d) {} 

但下面不會編譯。 Java說for-each循環變量應該是Object類型的。

C c = new D(); 
for (B b : c) {} 

我知道我可以強制安撫在第二個例子中的編譯器,但這似乎很可惜。有什麼辦法可以聲明接口C和子類D,以便我可以支持這兩種迭代場景,或者這是不可能的?謝謝!

回答

5

當您將新的D指定爲c時,您正在使用C接口的原始形式。使用接口的原始形式強制在接口中的所有內容上進行類型擦除,這意味着在foreach循環中返回的Iterator返回Object s,而不是B s。

但是C需要一個仍然必須提供的類型參數,即使D本身不是通用的。嘗試

C<B> c = new D(); 
+0

啊哈!不知何故,C的類型參數需要B的一個子類的事實讓我忽略了這一點。現在你明確指出了這一點。謝謝! –