【问题标题】:Java - Creating array of an object with generic parametersJava - 使用泛型参数创建对象数组
【发布时间】:2014-03-31 11:18:23
【问题描述】:

所以我知道通常可以创建一个通用数组:

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

但是我有一个类Entrant<K, V>,它有两个通用参数。 我似乎无法将 Object 数组转换为它。

这是完整的代码和运行时的错误

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)

Mainy 中的第 32 行:

HashTable h = new 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
    }

}

【问题讨论】:

标签: java arrays generics


【解决方案1】:

当您在课堂外公开数组时,不能保证将 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();

该代码将在第二次赋值中抛出ClassCastException

在参数化类型数组的情况下,转换会失败,因为它被擦除到:

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

显然Object[] 不是Extrant[]。这样就行不通了。您可以直接创建原始类型的数组,而不是进行强制转换:

_entrants = new Entrant[N];

并抑制出现的警告。

另见:

【讨论】:

  • new Entrant&lt;?, ?&gt;[N],如果你想避免原始类型
【解决方案2】:

这背后的逻辑是:

每个进入者都是对象,但每个对象都不是进入者。看,你正在将对象投射到无法工作的参赛者身上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多