2010-01-05 18 views
15

Estoy intentando implementar una clase interna que tenga un tipo parametrizado genérico.¿Cómo uso los tipos genéricos paramertizados en una clase interna?

Aquí es una versión corta de mi código:

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

} 

No funciona. Eclipse/Java me está dando una advertencia de que el parámetro tipo T en la clase interna está 'ocultando' el parámetro de la superclase. ¿Alguna idea sobre cómo puedo solucionar esto?

EDIT: Agregué la otra clase interna con la que estoy teniendo problemas: TreePreOrderIterator. El tipo genérico T será el mismo para AVLTree, BinaryNode y TreePreOrderIterator. Las clases internas necesitan acceder a los campos en AVLTree.

EDIT2: Además, el Iterator tiene acceso a BinaryNode<T>, lo cual es un conflicto.

. (Nota: Esto es parte del proyecto más grande que estoy haciendo para una clase Si se necesita cualquier otra información, por favor pregunte.)

+0

¿Puedes editar tu pregunta para incluir cómo se usa el tipo genérico de BinaryNode? Por ejemplo, ¿BinaryNode está parametrizado por el mismo tipo que AVLTree? – Carl

+0

Acaba de editarse. ¿Responde esto a tu pregunta? –

Respuesta

28

Si desea T en BinaryNode ser del mismo tipo que el que encierra T asociado con AVLTree, retire la declaración de T en BinaryNode.

Si desea que el T en BinaryNode a ser diferente de la que encierra T asociado con AVLTree, pero quiere ser capaz de acceder a las propiedades de la matriz AVLTree, cambiar el nombre de T a otra cosa.

Si no es necesario acceder a la propiedades del AVLTree que encierra, hacen BinaryNode estática.

+0

Bien, gracias.Lo cambié a algo diferente porque necesito acceder a propiedades o campos en AVLTree. El problema es que estoy recibiendo algunos errores de compilación ahora como "No coinciden los tipos: no se puede convertir de AVLTree.TreePreOrderIterator a iterador " y "falta de coincidencia Bound: El tipo T no es un sustituto válido para el parámetro acotado > del tipo AVLTree .TreePreOrderIterator . " ¿Alguna reparación? –

+0

Pruebe ''. – notnoop

+1

Quité la declaración de T (la primera opción). Ahora cuando escribo "return new AVLTree.TreePreOrderIterator ();" Me aparece el error "El tipo de miembro AVLTree.TreePreOrderIterator debe calificarse con un tipo parametrizado, ya que no es estático". Cuando elimino "" del código anterior, aparece la advertencia "AVLTree.TreePreOrderIterator es un tipo sin formato. Las referencias al tipo genérico AVLTree .TreePreOrderIterator se deben parametrizar". –

7

Sólo cambiar el nombre de T a otra cosa por lo que no entraría en conflicto con la clase externa T.

Los nombres de parámetros de tipo son visibles en todo el ámbito de clase, incluidas las clases internas. Por lo tanto, las clases internas o los métodos de instancia deberían declarar otro parámetro de tipo cuyo nombre entra en conflicto con el parámetro de tipo de clase. Sin embargo, las clases estáticas estáticas y los métodos estáticos no tienen ese problema.

0

es porque el parámetro T (como el parámetro para la clase BinaryNode<T>) es el mismo que el utilizado para AVLTree<T> - el parámetro utilizado para AVLTree está normalmente en el alcance de la definición de la clase interna BinaryNode, sino porque' re dando un nuevo parámetro con el mismo nombre, estará oculto. Se podría utilizar en su lugar:

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

Simplemente elimine la declaración de tipo genérico de la clase BinaryNode. Como la clase se declara privada, solo puede existir dentro de AVLTree y, por lo tanto, puede usar la T declarada para AVLTree en cualquier lugar dentro de BinaryNode.