2010-01-05 23 views
15

我想實現一個具有泛型參數化類型的內部類。如何在內部類中使用參數化的泛型類型?

這裏是我的代碼短版:

public class AVLTree<T extends Comparable<? super T>> implements Iterable<T> { 
... 

private class BinaryNode<T extends Comparable<? super T>> { 
    ... 
} 

private class TreePreOrderIterator<E extends Comparable<? super E>> implements Iterator<E> { 
    ... 
} 

} 

它不工作。 Eclipse/Java給我一個警告,內部類的T參數是'隱藏'超類的參數。有關我如何解決這個問題的任何想法?

編輯:我添加了我有問題的其他內部類:TreePreOrderIterator。對於AVLTree,BinaryNodeTreePreOrderIterator,通用類型T將是相同的。內部類需要訪問AVLTree中的字段。

編輯2:另外,Iterator訪問BinaryNode<T>,這是一個衝突。

(注:這是更大的項目我做一類的部分如果需要任何其他信息,請詢問。)

+0

你可以編輯你的問題,包括如何使用BinaryNode的泛型類型?例如,BinaryNode是否由與AVLTree相同的類型參數化? – Carl 2010-01-05 23:38:55

+0

剛剛編輯。這回答了你的問題了嗎? – 2010-01-06 00:49:18

回答

28

如果你想在BinaryNodeT是同一類型與AVLTree相關的封閉T,刪除BinaryNodeT聲明。

如果你想在BinaryNodeT比與AVLTree相關的封閉T 不同,但你 希望能夠訪問性能父AVLTree的 ,重命名T到 別的東西。

如果您不需要訪問 封裝的屬性AVLTree, 使得BinaryNode靜態。

+0

好的,謝謝。我將它改爲不同的原因,因爲我需要訪問AVLTree中的屬性或字段。 問題是我現在收到一些編譯錯誤,例如「類型不匹配:無法從AVLTree.TreePreOrderIterator 轉換爲迭代器」和「Bound不匹配:類型T不是有界替代參數>類型AVLTree .TreePreOrderIterator 「。 是否有修正? – 2010-01-06 00:30:03

+0

Try''。 – notnoop 2010-01-06 14:49:39

+1

我刪除了T的聲明(第一個選項)。現在當我寫「返回新的AVLTree.TreePreOrderIterator ();」我收到錯誤「成員類型AVLTree.TreePreOrderIterator 必須使用參數化類型進行限定,因爲它不是靜態的。」當我從前面的代碼中刪除「」時,我得到警告「AVLTree.TreePreOrderIterator是一個原始類型。對泛型類型AVLTree .TreePreOrderIterator 的引用應該被參數化。 – 2010-01-06 15:48:09

7

只需重命名T到別的東西所以它不會有衝突外部類T.

類型參數名稱在所有類作用域(包括內部類)中都可見。所以內部類或實例方法應該聲明另一個類型參數,其名稱與類類型參數衝突。但是,靜態嵌套類和靜態方法沒有這個問題。

0

這是因爲參數T(作爲BinaryNode<T>類參數)相同的是,用於AVLTree<T> - 用於AVLTree參數通常是在範圍爲內部類BinaryNode的定義,但因爲你」重新給出一個新的參數同名,它將被隱藏。你也可以使用:

private class BinaryNode<U extends Comparable<? super T>> { ... } 
1

只需從BinaryNode類中刪除泛型類型聲明即可。由於該類聲明爲私有的,因此它只能存在於AVLTree中,因此您可以在BinaryNode中的任意位置使用爲AVLTree聲明的T。