我想知道如何迭代使用foreach混合內容的列表。請參閱下面的示例代碼。如何使用foreach迭代混合列表?
public class GenericsForeach {
class A {
void methodA() {
System.out.println(getClass().getSimpleName() + ": A");
}
}
class B extends A {
void methodB() {
System.out.println(getClass().getSimpleName() + ": B");
}
}
void test() {
List<A> listOfA = new ArrayList<A>();
listOfA.add(new A());
List<B> listOfB = new ArrayList<B>();
listOfB.add(new B());
List<? super A> mixed = new ArrayList<A>();
mixed.addAll(listOfA);
mixed.addAll(listOfB);
Iterator<? super A> it = mixed.iterator();
while (it.hasNext()) {
A item = (A) it.next();
item.methodA();
}
// XXX: this does not work
// for (A item : mixed) {
// item.methodA();
// }
}
public static void main(String[] args) {
new GenericsForeach().test();
}
}
我建造兩個清單不同,但相互關聯的內容類型A
和B
(B
延伸A
)。我將這兩個列表添加到「混合」列表中,我聲明它包含<? super A>
類型。由於這個混合列表是A
(或B
)類型的'消費'項目,我應用了Bloch的PECS規則(Producer Extends,Consumer Super)來確定我需要<? super A>
。
到目前爲止,這麼好。但是現在當我想要遍歷這個混合列表時,我只能用Iterator<? super A>
和一個演員A item = (A) it.next()
來完成它。當我嘗試使用foreach循環(請參閱註釋掉的代碼)時,沒有快樂:
類型不匹配:無法從元素類型捕獲轉換#8 - 超級GenericsForeach.A到GenericsForeach.A
的Eclipse甚至幫忙,提供了
更改類型 '項' 到「嗎?超A」
但這會導致災難:
for (? super A item : mixed) {
item.methodA();
}
所以我不知道。 Eclipse似乎並不知道。這裏有其他人知道這是否可能,如果不是,爲什麼不呢?
我同意..想說同樣的話,但你對我來說太快:) – Fortega 2010-02-26 15:14:35
我希望它會比這更復雜...( - ;謝謝! – 2010-02-26 16:25:21