2014-03-31 84 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

背后的逻辑是这样的:

每个参赛者是一个对象,但是每个对象不是一个参赛者。看到,您正在将对象投射到无法工作的参赛者。