Java泛型:包含泛型的数组

8

可能是重复问题:
Java如何:泛型数组创建
错误的泛型数组创建

我被要求用Java编写一个哈希表,它必须与任何数据类型一起使用。 我正在编写的代码规则如下: - 哈希表必须具有一个数组作为底层数据结构,其大小在对象构造时确定 - 当发生冲突时,应将发生冲突的元素放入链表中,该链表保存哈希表中该索引(键)处的所有元素

因此,对于底层数据类型,我已经制作了一个LinkedList类型的数组(自定义,而不是Java API LinkedList)。

private LinkedList<T>[] table;

问题在于实例化该数组。以下是我的一些尝试:
public HashTable(int size) {
  table = new LinkedList<T>[size];
}

这会引发编译时的泛型数组创建错误。
public HashTable(int size) {
  table = (LinkedList<T>[])(new Object[size]);
}

这会导致运行时出现ClassCastException错误(java.lang.Object无法转换为LinkedList)。

负责该项目的人也不确定如何处理此问题。有没有办法修改我的代码,使哈希表仍然具有数组作为其基础数据结构,并将冲突放置在LinkedList中?


1
看看这个链接是否能帮到你:http://stackoverflow.com/questions/3903196/error-generic-array-creation - David Z
1
另一个原因是,谁曾认为类型擦除是实现泛型的好方法,应该被枪毙。 - NullUserException
如果这是一份作业,请标记为作业。 - Mike Samuel
@DavidZaslavsky,看起来我们决定使用你发布链接中提出的解决方案,使用ArrayList作为集合。非常感谢你,我需要加强我的搜索技能。 - Tanaki
我觉得这不是作业是不可能的。 - Dave Newton
@DaveNewton - 你不认为有些公司可能会自己编写哈希表吗?我们使用自己编写的IDE来编写字符串。 - Paul Bellora
3个回答

7
这对我有用:

这对我有用:

public class HashTable<T> {

    private LinkedList<T> table[];

    @SuppressWarnings("unchecked")
    public HashTable(int size) {
        table = new LinkedList[size];
    }

}

例如:

HashTable<String> t = new HashTable<String>(10);
t.table[0] = new LinkedList<String>();
t.table[0].add("test");
System.out.println(t.table[0].get(0));

是的,构造函数产生了一个警告(这解释了“unchecked”注释),但之后代码工作没有更多的警告。


1

只需使用Object[]作为您的数据存储,并手动将其转换为特定类型。这在构建基础设施方面是可以接受的,因为类型关系可能比通常更加困难。

值得一提的是,以下是在Java中创建通用数组的方法:

@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
    return Arrays.copyOf(array, length);
}

//used in your example

    private LinkedList<T>[] table;

    public HashTable(int size) {
        table = newArray(size);
    }

0

这不是最理想的方法,但你可以这样做:

import java.util.LinkedList;

public class Test
{
    static class HashTable<T>
    {
        public HashTable(int size)
        {
            LinkedList<T>[] table = (LinkedList<T>[])java.lang.reflect.Array.newInstance(LinkedList.class, size);
        }
    }

    public static void main(String[] args)
    {
        HashTable<Integer> table = new HashTable<Integer>(23);
    }
}

Class -> Class<T>,不要陷入并丢弃Exception e。为什么不直接将LinkedList.class传递给newInstance?你根本不需要使用forName查找。 - Mike Samuel
Array.newInstance(LinkedList.class, size)new LinkedList[size] 完全相同。 - user102008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接