Comment utiliser des types génériques paramétrés dans une classe interne?
Je suis en train de mettre en œuvre un intérieur classe qui a un générique paramétrable type.
Ici est une version courte de mon code:
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> {
...
}
}
Il ne fonctionne pas. Eclipse/Java est de me donner un avertissement que le type T
paramètre à l'intérieur de la classe est 'caché' de la super-classe du paramètre. Des idées sur comment je peux résoudre ce problème?
EDIT: j'ai ajouté les autres intérieur de la classe, je vais avoir des problèmes avec: TreePreOrderIterator
. Le type générique T
sera le même pour AVLTree
BinaryNode
et TreePreOrderIterator
. Les classes internes ont besoin d'accéder aux champs dans AVLTree.
EDIT2: en outre, l' Iterator
accède à un BinaryNode<T>
qui est un conflit.
(Note: Ceci est une partie d'un plus grand projet que je suis en train de faire pour une classe. Si d'autres informations sont nécessaires, merci de demander.)
source d'informationauteur Will M
Vous devez vous connecter pour publier un commentaire.
Si vous voulez
T
dansBinaryNode
à être le même type que la enfermantT
associés àAVLTree
suppression de la déclaration deT
dansBinaryNode
.Si vous voulez le
T
dansBinaryNode
être différent de ce que l'enfermantT
associé avec
AVLTree
, mais vousvoulez être en mesure d'accéder à des propriétés
de la société mère
AVLTree
, renommerT
àquelque chose d'autre.
Si vous n'avez pas besoin d'accéder à
propriétés de la enfermant
AVLTree
,faire
BinaryNode
statique.Il suffit de renommer
T
à autre chose, alors il ne serait pas en conflit avec l'extérieur de la classe T.Les noms de paramètre de type sont visibles dans toute l'étendue de classe, y compris à l'intérieur des classes. Donc, intérieur des classes ou des méthodes d'instance doit déclarer encore un autre type de paramètre dont le nom en conflit avec la classe paramètre de type. Cependant, statique classes imbriquées et méthodes statiques n'ont pas ce problème.
Enlevez juste le générique de la déclaration de type de la BinaryNode classe. Depuis la classe est déclarée privée, il ne peut exister que dans AVLTree, et à cet effet, vous pouvez utiliser le T déclaré pour AVLTree n'importe où à l'intérieur de BinaryNode.
C'est parce que le paramètre
T
(en tant que paramètre pour laBinaryNode<T>
classe) est le même que celui utilisé pourAVLTree<T>
-- le paramètre utilisé pourAVLTree
est normalement dans le champ de la définition de l'intérieur de la classeBinaryNode
mais parce que vous donnez un nouveau paramètre du même nom, il sera caché. Vous pourriez utiliser: