2014-12-11 12 views
5

Poniższy fragment kodu zgłasza błąd: "Generic array creation" pomimo braku ogólnych wystąpień w klasie Node. Jeśli jednak zadeklaruję prywatny węzeł klasy jako statyczny, błąd zniknie. Dlaczego słowo kluczowe statyczne jest tutaj ważne?Dlaczego muszę zadeklarować prywatną statystykę klasy, aby uniknąć błędu "Generic Array Creation"?

public class SeperateChainingST<Key, Value>{ 

     private int M =97; 
     private Node[] st = new Node[M]; 

     private class Node{ 
      Object key; 
      Object val; 
      Node next; 
     } 
    } 
+0

nie trzeba zdefiniować klasę Node pierwszy i używać go po ? –

+0

Nie wierzę, że ten kod to robi. – chrylis

+2

@KickButtowski Nie, Java nie ma nieprzyjemnych reguł deklaracji forward. – chrylis

Odpowiedz

5

Node to niestatyczna klasa zagnieżdżona. Oznacza to, że jest to klasa wewnętrzna i mieści się w zakresie jej parametrów zewnętrznych.

Po napisaniu typu Node bez żadnych wyraźnych kwalifikacji wewnątrz SeperateChainingST, jest on domyślnie kwalifikowany jako SeperateChainingST<Key, Value>.Node. Jest to typ sparametryzowany (ma parametry typu Key i Value), nawet jeśli nie "widzisz" ich podczas pisania Node.

Jak wiadomo, nie można korzystać z tworzenia wyrażenia tablicy z typem składnika, który jest rodzajem parametryzowane:

Więc nie można zrobić

new Node[5] // which is equivalent to 
new SeperateChainingST<Key, Value>.Node[5] 

Ale, jak może wiecie, Wywołanie kreacji tablic może być używane z typem składnika, który jest typu surowego lub parametrem sparametryzowanym ze wszystkimi symbolami wieloznacznymi:

new HashMap[5] 
new HashMap<?,?>[5] 

Możemy zrobić to podobnie tutaj, z wyjątkiem tego, jak uzyskać surowy typ wewnętrznej klasy Node? Nie jest to po prostu Node, jak znaleźliśmy. Zamiast tego należy jednoznacznie zakwalifikować go z surowym rodzaju zewnętrznej Klasa:

new SeperateChainingST.Node[5] 

lub z all-symboli wieloznacznych sposób:

new SeperateChainingST<?,?>.Node[5] 
Powiązane problemy