2010-01-05 15 views
15

Sto provando ad implementare una classe interna che ha un tipo parametrico generico.Come utilizzare i tipi generici parametrizzati in una classe interna?

Ecco una versione breve del mio codice:

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> { 
    ... 
} 

} 

Non funziona. Eclipse/Java mi avvisa che il parametro tipo T sulla classe interna sta "nascondendo" il parametro della super classe. Qualche idea su come posso risolvere questo problema?

MODIFICA: ho aggiunto l'altra classe interna che sto avendo problemi con: TreePreOrderIterator. Il tipo generico T sarà lo stesso per AVLTree, BinaryNode e TreePreOrderIterator. Le classi interne devono accedere ai campi in AVLTree.

EDIT2: Inoltre, lo Iterator accede a BinaryNode<T>, che è un conflitto.

(Nota:. Questo è parte del più ampio progetto che sto facendo per una classe Se è necessaria qualsiasi altra informazione, si prega di chiedere.)

+0

è possibile modificare la domanda per includere l'utilizzo del tipo generico di BinaryNode? ad esempio, il BinaryNode è parametrizzato dallo stesso tipo di AVLTree? – Carl

+0

Appena modificato. Questo risponde alla tua domanda? –

risposta

28

Se volete T in BinaryNode ad essere dello stesso tipo come il racchiude T associato con AVLTree, rimuovere la dichiarazione di T in BinaryNode.

Se si desidera che il T in BinaryNode di essere diverso da quello che racchiude T associato con AVLTree, ma si vuole essere in grado di accedere alle proprietà del genitore AVLTree, rinominare T a qualcos'altro.

Se non è necessario per accedere proprietà del racchiude AVLTree, fanno BinaryNode statica.

+0

Ok, grazie.L'ho modificato in qualcosa di diverso perché ho bisogno di accedere a proprietà o campi in AVLTree. Il problema è che ora sto ottenendo alcuni errori di compilazione come "Tipo mancata corrispondenza: impossibile convertire da AVLTree.TreePreOrderIterator a Iterator " e "Disallineamento associato: il tipo T non è un sostituto valido per il parametro limitato > del tipo AVLTree .TreePreOrderIterator . " Eventuali correzioni? –

+0

Provare ''. – notnoop

+1

Ho rimosso la dichiarazione di T (la prima opzione). Ora quando scrivo "return new AVLTree.TreePreOrderIterator ();" Viene visualizzato l'errore "Il tipo di membro AVLTree.TreePreOrderIterator deve essere qualificato con un tipo parametrizzato, poiché non è statico." Quando rimuovo "" dal codice precedente, viene visualizzato il messaggio di avviso "AVLTree.TreePreOrderIterator è un tipo non elaborato. Riferimenti al tipo generico AVLTree deve essere parametrizzato" .TreePreOrderIterator ". –

7

Basta rinominare T a qualcosa d'altro in modo che non sarebbe in conflitto con il classe esterna T.

I nomi dei parametri dei tipi sono visibili in tutto lo scope della classe, comprese le classi interne. Quindi le classi interne oi metodi di istanza dovrebbero dichiarare ancora un altro parametro di tipo il cui nome è in conflitto con il parametro del tipo di classe. Tuttavia, le classi nidificate statiche e i metodi statici non hanno questo problema.

0

E 'perché il parametro T (come parametro per la classe BinaryNode<T>) è lo stesso di quello utilizzato per AVLTree<T> - il parametro utilizzato per AVLTree si trova normalmente in ambito per la definizione della classe interna BinaryNode, ma perché' re dando un nuovo parametro lo stesso nome, sarà nascosto. Si potrebbe invece utilizzare:

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

Basta rimuovere la dichiarazione del tipo generico dalla classe BinaryNode. Poiché la classe è dichiarata privata, può esistere solo all'interno di AVLTree e quindi è sufficiente utilizzare la T dichiarata per AVLTree ovunque all'interno di BinaryNode.