Erro de compilation de criação de matriz genérica da class interna

Estou tentando implementar uma coleção vinculada usando genéricos, algo como o seguinte.

public class A { private class B { private B[] b; private E item; private B() { this.b = new B[2]; } } // end inner class B } // end class A 

A é a coleção e B um elemento ou nó na coleção com uma matriz que referencia sucessores / predecessores e um item.

A criação da matriz não é permitida. O erro que recebo é generic array creation . Estou certo em pensar que o que está realmente criando é uma matriz de A.B ?

Se não, o que está causando o erro?

Se sim, como posso contornar isso?

Eu obviamente omiti uma quantidade substancial de código, se o que eu forneci não for suficiente, por favor me avise. Qualquer conselho seria apreciado. Obrigado.

EDIT 1: Eu deveria ter mencionado que o tipo parametrizado deve ser o mesmo em A como em B Portanto, passar para a class interna não é possível, pois cria E#2 e deixa A com E#1 .

Você chama B herda o genérico da class externa, já que não é estático. E você não pode simplesmente torná-lo estático, porque ele precisará então de E também.

Então, sua matriz Bb precisará de um tipo genérico, ou seja, A.B ou se você alterar seu código para uma class interna estática , AB (se você usasse private static class B ).

Em Java, devido à maneira como os genéricos são implementados (por eliminação), o tipo do array não é bem definido. Por um lado, deve ser uma matriz de B , por outro lado, deve ser uma matriz de Object .

A solução mais viável parece ser usar Object[] e converter explicitamente. Se você quiser aumentar a segurança do tipo, é claro que você pode usar um ArrayList , que internamente usa Object[] também!

Em seu código particular, B b1, b2; também pode ser uma opção que é realmente mais rápida (sem verificação de limites) e precisa de menos memory (nenhum object de matriz; nenhuma informação de tamanho).

B é uma class interna não estática. Isso significa que ele tem uma referência a uma instância da class envolvente. Por isso, é implicitamente parametrizado pelo parâmetro type da class externa. Então, quando você escreve B , significa A.B . Para criar uma matriz, você deve usar a class bruta. No entanto, B não é a class bruta; para se referir à class bruta, você precisa qualificá-la explicitamente: AB

Então é isso que você quer:

 this.b = new AB[2]; 

Você precisa passar E para a class interna também

  private class B { private B[] b; private E item; private B() { this.b = new B[2]; } } // end inner class B