2014-11-14 13 views
5

Sto cercando di convertire un implementazione AVLTree in un array di stile mucchio e sto avendo alcuni problemi con i farmaci generici:Generics Java: Non è possibile creare una matrice di una classe annidata

public class MyAVLTree<K extends Comparable<? super K>, E> implements 
    OrderedDictionary<K, E> { 

    class AVLNode implements Locator<K, E>{ 
     // ... 
    } 

    // .... 

    public Locator<K,E> [] toBSTArray() { 
     AVLNode[] bArray = new AVLNode[size]; 
     makeArray(root, 0, bArray); // recursion 
     return bArray; 
    } 
} 

alla linea di AVLNode[] bArray = new AVLNode[size]; ottengo il errore seguente:

"Cannot create a generic array of MyAVLTree.AVLNode"

Non vedo cosa sto facendo male. Qualsiasi aiuto?

+1

lo risolve: 'classe AVLNode implementa il localizzatore '? – vikingsteve

+0

@vikingsteve questa dovrebbe essere una risposta – Andremoniy

+2

@vikingsteve Si sta solo nascondendo la variabile di tipo. Dubito fortemente che sia voluto. – Radiodef

risposta

3

classi interne catturano le variabili di tipo da una classe esterna quindi questo è il motivo per cui si ottiene l'errore.

Se si desidera creare un'istanza di un AVLNode[] si può beneficiare il nome della classe crudo come grezzo MyAVLTree:

//      vvvvvvvvv 
AVLNode[] bArray = new MyAVLTree.AVLNode[size]; 

Otterrete avvertimenti come si farebbe normalmente la creazione di un tipo di matrice crudo; tuttavia questo verrà compilato. Tieni presente le solite cose that come along with raw types se non le conosci, anche se ovviamente non puoi istanziare un array in Java che non sia raw.

+0

Grazie, sembra che abbia risolto il problema. Potrei giurare che ho provato quello e non lo fece :) – user66875

+0

Nessun problema, felice di aiutare. – Radiodef

0

Questo suona divertente, ma si può fare tale trucco:

AVLNode[] bArray = (AVLNode[]) Array.newInstance(AVLNode.class, size); 
+0

Grazie, sembra essere un'altra soluzione. – user66875

+1

Non ha senso usare 'Array.newInstance()' con una classe hardcoded in fase di compilazione. – newacct

Problemi correlati