當我使用實現ArrayList
的類並更改元素的泛型類型時,我發現了一些有趣的Java(或者至少是Netbeans)。我基本上創建了一個抽象類,它擴展了ArrayList
和一些應該與String
對象一起工作的子類(比如ArrayList<String>
)。其中一件事我沒有嘗試做到這一點是這樣的:設置迭代器的Java泛型
public abstract class A extends ArrayList {
...
}
@Override
public abstract class B extends A {
public Iterator<String> iterator() {
return super.iterator();
}
}
另一條是這樣的:
public abstract class A extends ArrayList {
...
}
public abstract class B<String> extends A {
@Override
public Iterator<String> iterator() {
return super.iterator();
}
}
第一個成功地覆蓋了iterator()
方法分配字符串值給它。另一個以某種方式取消了類型轉換。有趣的是,當涉及到循環時,它們都不起作用。這收到類型Object
而不是String
。
for (String s : B) {
...
}
你知道爲什麼會發生這種情況,如何修復它而無需實現自己的迭代器?
一般而言,您應[有利於構造而不是繼承](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance)([Effective Java,Item 16](http://books.google.com/books?id= ka2VUBqHiWkC&PG = PA81&LPG = PA81&DQ =贊成+組合物+ +過度繼承+有效+ Java和源= BL&OTS = yYEfOms-O4&S IG = AzKrW2db1sgCyjTP_u1F2B8P_cY&HL = EN&EI = rQ64TubcAuH74QTF_qjkAw&SA = X&OI = book_result&CT =導致&resnum = 5&VED = 0CDkQ6AEwBA#V = onepage&Q&F =假))。你爲什麼首先擴展'ArrayList'? –
你的意思是說,for循環s的類型是Object而不是String? – Tudor