2014-11-14 39 views
5

Próbuję przekonwertować implementację AVLTree do tablicy stylu kupie i mam pewne problemy z rodzajowych:Java rodzajowych: Nie można utworzyć tablicę zagnieżdżonej klasy

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; 
    } 
} 

na linii AVLNode[] bArray = new AVLNode[size]; otrzymuję następujący błąd:

"Cannot create a generic array of MyAVLTree.AVLNode"

Nie widzę, co robię źle. Jakaś pomoc?

+1

to rozwiązuje to: 'class AVLNode implementuje Locator '? – vikingsteve

+0

@vikingsteve to powinno być odpowiedzią – Andremoniy

+2

@vikingsteve Po prostu ukrywasz zmienną typu. Bardzo wątpię, czy jest to pożądane. – Radiodef

Odpowiedz

3

Klasy wewnętrzne uchwycić zmienne typu z zewnętrznej klasy tak, to dlaczego masz błąd.

Jeśli chcesz instancję surowego AVLNode[] można określić nazwę klasy jako surowca MyAVLTree:

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

Dostaniesz ostrzeżenia jak zwykle będzie stworzenie surowego typ tablicy; jednak to się skompiluje. Pamiętaj o zwykłych rzeczach that come along with raw types, jeśli ich nie znasz, chociaż oczywiście nie możesz utworzyć tablicy w Javie, która nie jest surowa.

+0

Dziękuję, wygląda na to, że naprawił problem. Mógłbym przysiąc, że próbowałem tego i to nie było :) – user66875

+0

Nie ma problemu, miło mi pomóc. – Radiodef

0

to brzmi śmiesznie, ale może zrobić taki trik:

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

Dzięki, to wydaje się być kolejnym rozwiązaniem. – user66875

+1

Nie ma sensu używanie parametru 'Array.newInstance()' z klasą zakodowaną na stałe podczas kompilacji. – newacct

Powiązane problemy