2012-05-20 7 views
5

Estoy tratando de implementar una colección vinculada usando genéricos, algo como el siguiente.Error de compilación de creación de matrices genéricas de la clase interna

public class A<E> { 

    private class B { 

    private B[] b; 
    private E item; 

    private B() { 
     this.b = new B[2]; 
    } 

    } // end inner class B 

} // end class A 

A es la recogida y B un elemento o nodo de la colección con una matriz referencia sucesores/predecesores y un elemento.

La creación de matriz no está permitida. El error que recibo es generic array creation. ¿Tengo razón al pensar que lo que realmente está creando es una matriz de A<E>.B?

Si no, ¿cuál es la causa del error?

Si es así, ¿cómo puedo evitar esto?

Obviamente he omitido una cantidad sustancial de código, si lo que he proporcionado no es suficiente, por favor hágamelo saber. Cualquier consejo sería apreciado. Gracias.

EDIT 1: debería haber mencionado que el tipo parametrizado debe ser la misma en A como en B. Por lo tanto, no es posible pasar <E> a la clase interna, ya que crea E#2 y deja A con E#1.

+0

específicamente una respuesta a su pregunta, pero sería mejor diseño para tener dos variables ' predecesor 'y' sucesor 'de tipo B en lugar de una matriz de dos elementos. Haría que tu clase sea más fácil de leer. Supongo que también haría que tu problema desapareciera. –

+0

WRT Edit1, pruebe una 'clase estática B ' y no tendrá el problema de nomenclatura. Sin embargo, la matriz aún no funcionará, ya que es Genérica. –

+0

También puede evitar esto mediante el uso de una colección genérica en lugar de una matriz. – trutheality

Respuesta

4

Usted llamar B hereda el genérico de la clase externa, ya que no es estática. Y no puede hacer que sea estático, ya que también necesitará E.

Así la matriz B.b se necesita de hecho un tipo que es genérico, es decir, A<E>.B o si desea cambiar el código para una clase interna estática , A.B<E> (si desea utilizar private static class B<E>).

En Java, debido a la forma en que se implementan los genéricos (por borrado), el tipo de matriz no está bien definido. Por un lado, debe ser una matriz de B, por otro lado, debe ser una matriz de Object.

La solución más viable parece ser usar Object[] y emitir explícitamente. Si desea mayor seguridad de tipo, puede usar un ArrayList<B>, que internamente también usa Object[].

En su código particular, B b1, b2; también podría ser una opción que es realmente más rápida (sin límites de comprobación) y necesita menos memoria (sin objeto de matriz, no hay información de tamaño).

+0

Pensé en usar las referencias separadas b1, b2. Parece que esta es la forma más adecuada de ir. Simplemente hace una travesía más complicada de la colección en algunos métodos. Gracias por sus comentarios, muy útiles. – comfortablejohn

-2

que necesita para aprobar E a la clase interna, así

private class B<E> { 

      private B[] b; 
      private E item; 

      private B() { 
       this.b = new B[2]; 
      } 

     } // end inner class B 
+2

¿No dará el mismo error? –

+0

Sí. Y según mi edición, requiero que los tipos sean los mismos tanto en la clase externa como en la interna. Hacer lo anterior significará que aunque ambos puedan ser convertidos en el mismo tipo, diga 'A ' que los convierte en ambos enteros, no son comparables o compatibles cuando se hace referencia entre los dos. – comfortablejohn

+0

Lo siento, no veo ningún beneficio. En su configuración, debería ser en mi humilde opinión 'clase estática privada B 'para no sobrecargar el nombre, y aún no permitirá la creación del' nuevo B [2] '. –

2

B es una clase interna no estática. Eso significa que tiene una referencia a una instancia de la clase adjunta. Entonces está parametrizado implícitamente por el parámetro tipo de la clase externa. Por lo tanto, cuando escribe B, significa A<E>.B. Para crear una matriz, debe usar la clase sin procesar.Sin embargo, B no es la clase raw; para referirse a la clase prima que necesita para calificar explícitamente: A.B

Así que esto es lo que desea:

this.b = new A.B[2]; 
No
Cuestiones relacionadas