2009-06-22 6 views
6

Mam więc tę ogólną funkcję klasy HashTable, którą rozwijam i chcę używać jej ogólnie dla dowolnej liczby przychodzących typów i chcę również zainicjować tablicę pamięci wewnętrznej jako tablica LinkedList (dla celów kolizyjnych), gdzie każda lista powiązań jest określona z wyprzedzeniem (dla bezpieczeństwa typu), aby była typu generycznego z klasy HashTable. Jak mogę to zrobić? Poniższy kod najlepiej wyjaśnia moje intencje, ale oczywiście się nie kompiluje.Inicjalizacja Java Generic Array of Type Generic

public class HashTable<K, V> 
{ 
    private LinkedList<V>[] m_storage; 

    public HashTable(int initialSize) 
    { 
     m_storage = new LinkedList<V>[initialSize]; 
    } 
} 
+0

duplikat http://stackoverflow.com/questions/529085/java-how-to-generic-array- tworzenie – skaffman

Odpowiedz

15

Generics w Javie nie pozwala na tworzenie tablic o typach ogólnych. Można oddać tablicę typu rodzajowego, ale wygeneruje ostrzeżenie niesprawdzony konwersji:

public class HashTable<K, V> 
{ 
    private LinkedList<V>[] m_storage; 

    public HashTable(int initialSize) 
    { 
     m_storage = (LinkedList<V>[]) new LinkedList[initialSize]; 
    } 
} 

Here jest dobrym wyjaśnieniem, nie wchodząc w szczegóły techniczne, dlaczego stworzenie tablicy rodzajowy nie jest dozwolone.

+1

+1 Dziękuję za wspaniałą odpowiedź i zasoby. –

+0

Możesz dodać @SuppressWarnings ({"niezaznaczone"}) do przypisania, aby kompilator był cichy. –

+0

Strona, z którą się łączyłeś, w rzeczywistości nie jest tym samym. [Ta sekcja] (http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ104) w Angelika Langer's Generics FAQ wyjaśnia to dobrze. –

0

Ponadto, można stłumić ostrzeżenia na metodzie poszczególnych metoda z użyciem adnotacji:

@SuppressWarnings("unchecked") 
public HashTable(int initialSize) { 
    ... 
    }