2016-06-21 60 views
-1
ArrayList<Student> al = new ArrayList<Student>(); 
Iterator itr = al.iterator(); 
while (itr.hasNext()) 
{ 
    Student st = (Student) itr.next(); 
    System.out.println(st.rollno+" "+st.name+""+st.age);             
} 

假設學生類有三個數據成員rollno,名稱和年齡。 所以,我的問題是爲什麼我們在聲明中沮喪學生st =(Student)itr.next(); 但是,如果我們將一個ArrayList的字符串作爲數據成員的類型,那麼不需要再次使用迭代器對其進行向下轉發。 請幫助清除我的疑問。迭代器接口和方法

+1

IIRC al.iterator()'會返回一個'Iterator ',因此不需要演員。這只是因爲你從'Iterator itr'中刪除了泛型。順便說一句,'ArrayList '也是如此,如果你遇到不同的結果你很可能有不同的代碼(例如你在這種情況下使用'Iterator ')。 – Thomas

+0

您可以將'Iterator itr'更改爲'Iterator itr'。 – Zircon

+0

我相信你還是必須施放:'String st =(String)itr.next();否則它不會編譯。如果列表中的對象類型是字符串,您是如何認爲不需要投射的? – SomeDude

回答

3

這是因爲您正在使用原始Iterator

的參數多爲Iterator例如:Iterator<Student> itr=al.iterator();

這時你不會有顯式轉換next調用(返回Object生時),以Student

您還可以饒了自己的混亂,如果你只是迭代和印刷,並使用,而不是快速列舉:

for (Student s: al) { 
    // print stuff 
} 
1

Iterator可以仿製藥的優勢,所以你可以有一個Iterator<Student>將返回Student實例時調用next()

實際上al.iterator()已經返回Iterator<Student>,您只需將其分配給原始Iterator即可將其泛型刪除。

查看相關問題:Iterator vs Iterator in java