2016-09-17 63 views
0

我試圖用Iterator作爲內部類實現集合接口。一個實現集合的ArrayCollection類具有一個通用數組(這是說類成員是否通用的正確方法?)。 a screenshot from IDE集合和迭代器接口作爲內部類的實現

public class ArrayCollection<T> implements Collection<T> { 
private T[] m = (T[])new Object[10]; 

然而,當我在一個Iterator接口實現下一個()的方法我不斷收到不兼容類型的錯誤。但是,如果創建一個ArrayIterator,則非泛型類編譯器不再有數組類型轉換的問題。 an error screenshot from IDE

private class ArrayIterator<T> implements Iterator<T> { 
    private int cursor = 0; 

    @Override 
    public boolean hasNext() { 
     return this.cursor >= ArrayCollection.this.size(); 
    } 

    @Override 
    public T next() { 
     return ArrayCollection.this.m[cursor++]; 
    } 
} 

所以,我有幾個問題:

  1. 爲什麼編譯器可以定義T []數組米型,如果我做一個ArrayIterator非通用?

  2. 是否只有內部類實現/擴展通用接口/類可以是非泛型的?

+0

你可以在這裏分享代碼嗎? – Mureinik

+0

添加代碼。還有IDE的鏈接截圖。我的堆棧溢出評級太低,無法將圖像直接添加到問題中。 – user2992672

+1

絕不添加圖片,添加代碼 –

回答

1

在第二個示例中,您正在處理兩個不同類型的變量。外部類和內部類分別定義變量T,但它們不相同。有幾種方法來解決這個問題,一個是從內部類聲明中刪除T:

private class ArrayIterator implements Iterator<T> { 

現在你只引用外T,而不會引入一個獨立的內部牛逼

不過,我想個人更喜歡使內部類爲靜態,在這種情況下,您不能使用外部類型的變量。在這種情況下,你會寫

private static class ArrayIterator<T> implements Iterator<T> { 

如果你這樣做,你需要的類型變量從外部類型傳遞到內:

return new ArrayIterator<T>(); 

的主要區別是,一個類定義類型參數會隱藏任何現有的同名類型參數,這會導致出現奇怪的錯誤消息。

最後讓我補充說,從頭開始實施一個集合通常不是一個好主意。相反,您可能需要擴展AbstractCollectionAbstractList。這將讓你專注於你的核心算法,但免費提供所有樣板方法。

2

您的類型變量同樣命名爲ArrayIterator<T>ArrayCollection<T>T有不同的T

你可以只取出<T>ArrayIterator(因爲它是一個非靜態內部類),只是有Iterator使用T從父類:

private class ArrayIterator implements Iterator<T> { 

這將解決編譯問題,然後將碼。