2011-08-26 84 views
0

我有兩個類:ParentClass和SubClass。子類從ParentClass繼承。 我有下面的代碼:(內部類)創建ListIterator時會發生什麼?

List<SubClass> lstSub; 

//some initialization 

public ListIterator getLstIterator(int i) { 
    return lstSub.listIterator(i); 
} 

和客戶端類使用它的方式如下:

ListIterator<ParentClass> lstParent = getLstIterator(0); //assign ListIterators 

所以,問題: 什麼程序做的,而分配ListIterators:

1)它創建一個新列表並從源列表中複製那些元素,將它們轉換爲ParentClass;

2)它只是創建一個鏈接到lstSub,從這個時候這個列表被解釋爲列表ListIterator?

或者它還做了其他事情? 因爲程序性能,我對它感興趣。我是Java新手,非常感謝任何幫助。

+0

你有性能問題? – Tom

回答

1

它不創建另一個列表。如果您在不知道列表中的類的情況下得到列表迭代器,那麼這將在您的泛型使用中出現錯誤。你做這個任務時應該得到警告,但這只是一個警告。當你真正使用它時,它會投射到任何課堂上。如果你想要一個列表迭代器,那麼你應該堅持這樣做,因爲ListIterator<? extends ParentClass>,但實際上持有迭代器有點奇怪。

最後,只需要一點建議,我不會擔心語言功能的表現太多,特別是如果你只是在語言中的腳步。

1

創建了一個新的ListIterator實例。到新的對象的引用被複制到lstParent

here參見

 public ListIterator<E> listIterator(int index) { 
     if (index < 0 || index > size) 
      throw new IndexOutOfBoundsException("Index: "+index); 
     return new ListItr(index); 
    } 

聲明:本實例是特定於ArrayList的。

1

從表現上看,沒有列表複製正在進行。

但可以讓編譯器檢查代碼的類型安全,你應該聲明的類型參數是這樣的:

public ListIterator<SubClass> getLstIterator(int i) { 
    return lstSub.listIterator(i); 
} 

... 

ListIterator<? extends ParentClass> lstParent = getLstIterator(0); 
+0

如果我這樣做並使用:ListIterator lstParent = getLstIterator(0); - 這就是我想要的,我有編譯器錯誤:輸入不匹配不幸。 – Deepscorn

+0

哦,對不起,我以爲ListIterator <?擴展ParentClass>是一種僞代碼......但它不。 – Deepscorn