2016-02-04 59 views
0

實際列表的迭代器被實現爲列表類中的內部類。因此,我們可以從內部類引用List的泛型類型。那麼爲什麼迭代器是通用的?如果我們從實際的List中調用一個迭代器,那麼next()方法將使用調用迭代器的List的Generic類型。Java - 爲什麼迭代器需要是通用的?

回答

0

Iterator接口被設計爲

public interface Iterator<E> { 
    boolean hasNext(); 
    E next(); 
    void remove(); 
} 

注意next方法。如果接口不是通用的,它會有什麼樣的返回類型?這將是

Object next(); 

因此,沒有參數,你最終會得到這樣的代碼:

List<String> list = createSomeList(); 
String s = (String) list.iterator().next(); 

注意必要的演員。泛型的要點是無需投射就可以生成代碼;這叫做型安全。使用當前的迭代器接口,你可以做

List<String> list = createSomeList(); 
String s = list.iterator().next(); 
1

因爲我們重寫了超類的方法。如果超類沒有提供通用簽名,則不能用自定義對象覆蓋它。

0

並不是所有迭代器都作爲內部類來實現。即使如此,返回迭代器的實例仍將從集合類型(列表,您的情況)中獲取

然而點卻與列表及其調用者之間的契約鏈接。 List/Collection.iterator()應該基於類型參數[無論您是否使用中間變量來存儲迭代器]返回泛型迭代器。

相關問題