2014-03-31 114 views
1

所以我通常知道要創建一個通用的數組,你可以這樣做:爪哇 - 創建一個對象的數組泛型參數

E[] e = (E[]) new Object[10]; 

但是我有一個類Entrant<K, V>它有兩個通用的參數。 我似乎無法將一個Object數組轉換爲它。

這裏是Mainy完整的代碼和運行時錯誤

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LHashTable.Entrant; 
    at HashTable.HashTable.<init>(HashTable.java:10) 
    at Mainy.map(Mainy.java:32) 

線32:

HashTable h = new HashTable(); 

Hashtable的代碼:

public class HashTable<K, V> { 

    Entrant<K, V>[] _entrants; 
    private static final int N = 16; 

    public HashTable() { 
     _entrants = (Entrant<K, V>[]) new Object[N]; //line 10 
    } 

} 
+2

你試圖做的事情不起作用。一個'Object []'不是'入口者 []',所以你得到一個'ClassCastException'。看到這個問題:http://stackoverflow.com/questions/1817524/generic-arrays-in-java?rq=1 – Jesper

+0

也..請遵循標準的Java命名慣例 - 如果您想避免原始類型,請遵循標準的Java命名約定 - 例如 – TheLostMind

回答

4

鑄造Object[]E[]不能保證當你在你的課堂外暴露數組時你就會工作。鑄造在構造函數中使用,因爲類型參數E的類型擦除Object,和演員實際上相當於:

Object[] e = (Object[]) new Object[10]; 

但是,假設你HashTable類提供了一個K[]陣列:

class HashTable<K, V> { 

    K[] _entrants; 
    private static final int N = 16; 

    public HashTable() { 
     _entrants = (K[]) new Object[N]; //line 10 
    } 

    public K[] getEntrants() { 
     return _entrants; 
    } 
} 

並創建它的實例,並從中獲得參賽者:

HashTable<String, String> hashTable = new HashTable<>(); 
String[] entrants = hashTable.getEntrants(); 

Th在代碼將拋出ClassCastException在第二個任務。

儘管在參數化類型陣列的情況下,因爲它是被擦除到鑄造會失敗:

_entrants = (Entrant[]) new Object[N]; //line 10 

顯然的Object[]不是Extrant[]。所以這將失敗。而不是做演員陣容,你可以直接創建一個原始類型的陣列:

_entrants = new Entrant[N]; 

並禁止發出警告。

另請參見:

+0

或新的參與者 [N] – newacct

0

背後的邏輯是這樣的:

每個參賽者是一個對象,但是每個對象不是一個參賽者。看到,您正在將對象投射到無法工作的參賽者。