Java 泛型与数组

Java 泛型与数组,java,arrays,generics,Java,Arrays,Generics,我在许多答案(例如)中看到,使用泛型创建数组的方法如下: T[] array = (T[]) new Object[SIZE]; 我正在尝试做类似的事情: EntryRecipient<K,V>[] array = (EntryRecipient<K,V>[]) new Object[MAX_SIZE]; 我的代码是: 哈希表条目(作为哈希表的私有子类包含) 类HashTableEntry{ 私钥; 私人价值; 公共哈希表条目(K键,V值){ this.key=key

我在许多答案(例如)中看到,使用泛型创建数组的方法如下:

T[] array = (T[]) new Object[SIZE];
我正在尝试做类似的事情:

EntryRecipient<K,V>[] array = (EntryRecipient<K,V>[]) new Object[MAX_SIZE];
我的代码是:

哈希表条目(作为哈希表的私有子类包含)

类HashTableEntry{
私钥;
私人价值;
公共哈希表条目(K键,V值){
this.key=key;
这个值=值;
}
公共价值{
返回值;
}
公钥{
返回键;
}
}
EntryRecipient(作为哈希表的私有子类包含)

私有类入口收件人{
私人名单条目;
公共入口收件人(){
entries=newarraylist();
}
//…其他方法
}
哈希表

class HashTable<K,V> {
    private EntryRecipient<K,V>[] map;
    private final int MAX_SIZE = 199; // Prime, to avoid collisions
    private int size;

    public HashTable() {
        map = (EntryRecipient<K,V>[]) new Object[MAX_SIZE];
        size = 0;
    }
    // ... other methods
}
类哈希表{
私有入口接收者[]映射;
private final int MAX_SIZE=199;//素数,以避免冲突
私有整数大小;
公共哈希表(){
映射=(EntryRecipient[])新对象[最大大小];
尺寸=0;
}
//…其他方法
}

你能给我一些提示来解决这个问题吗?

我找不到任何理由在这段代码中为
EntryRecipient[]
使用
对象[]
。数组的引用不是泛型引用,因此请使用该类类型的数组。在Java中,无法将对象数组直接转换为
EntryRecipient
数组。(
EntryRecipient[]
T[]
不同)。问题的解决方案是修改
哈希表
构造函数,如下所示:

public HashTable() {
    // Create an array of EntryRecipient
    map = new EntryRecipient[MAX_SIZE];
    size = 0;
    // Initialize the array
    // Otherwise you will get NullPointerException
    for (int i = 0; i < MAX_SIZE; i++) {
        map[i] = new EntryRecipient<K, V>();
    }
}
公共哈希表(){
//创建EntryRecipient的数组
map=新入口收件人[最大大小];
尺寸=0;
//初始化数组
//否则您将获得NullPointerException
对于(int i=0;i
首先问问自己:“我真的需要阵列吗?”?我可以用
ArrayList
吗?数组列表是数组上非常薄的包装器;您的代码必须对性能非常敏感,才能看到速度上的任何差异。然而,所有这些泛型类型的东西都是有效的。

什么是
EntryRecipient
它是一个具体的类吗?还有,你为什么不使用
列表
在我的情况下,我不能使用
列表
EntryRecipient
是一个具体的类,包含哈希表的
列表
(由一对值组成,
K键
V值
)@RealDis疑论者是的,我的问题是打字错误,但代码是正确的。我编辑了这个问题。经验法则是-没有代码的外部链接。将代码的要点(相关部分和引用的内容)包含在问题本身中,而不是StackOverflow之外。@vaxquis是的,数组在运行时比泛型提供了更多的类型安全性,泛型的主要目的是在编译时提供额外的类型控制,但是当使用例如rawtypes时,它不能防止出现问题。另外,感谢您提醒我们由原始类型导致的
检查列表的丑陋。因此,是的,我同意当我们希望确保不会存储错误的对象时,具有适当类型的数组会更好(比如ArrayList,它在内部工作于
object[]
,这意味着它可以接受传递的任何对象,包括不正确的对象)。我正要发布相同的答案。使用
Object[]
仅对擦除后内容类型为动态的类有意义;对于这个具体的例子,使用raw类比复制到
Object[]
要好得多。
private class EntryRecipient<K,V> {
    private List<HashTableEntry<K,V>> entries;

    public EntryRecipient() {
        entries = new ArrayList<HashTableEntry<K,V>>();
    }

    // ... other methods
}
class HashTable<K,V> {
    private EntryRecipient<K,V>[] map;
    private final int MAX_SIZE = 199; // Prime, to avoid collisions
    private int size;

    public HashTable() {
        map = (EntryRecipient<K,V>[]) new Object[MAX_SIZE];
        size = 0;
    }
    // ... other methods
}
public HashTable() {
    // Create an array of EntryRecipient
    map = new EntryRecipient[MAX_SIZE];
    size = 0;
    // Initialize the array
    // Otherwise you will get NullPointerException
    for (int i = 0; i < MAX_SIZE; i++) {
        map[i] = new EntryRecipient<K, V>();
    }
}