Java泛型:包含泛型的数组[重复]

Posted

技术标签:

【中文标题】Java泛型:包含泛型的数组[重复]【英文标题】:Java Generics: Array containing generics [duplicate] 【发布时间】:2011-12-24 01:33:04 【问题描述】:

可能重复:Java how to: Generic Array creationError generic array creation

我的任务是用 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 中?

【问题讨论】:

看看***.com/questions/3903196/…对你有没有帮助 认为类型擦除是实现泛型的好方法的另一个原因应该被枪杀。 如果这是家庭作业,请注明。 @DavidZaslavsky,看来我们已经决定使用您发布链接的问题中提出的解决方案,使用 ArrayList 作为集合。非常感谢,我需要提高我的搜索技能。 我无法相信这不是家庭作业。 【参考方案1】:

这并不理想,但您可以这样做:

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&lt;T&gt; 并且不要捕获和丢弃Exception e。为什么不直接将LinkedList.class 传递给newInstance?您根本不需要 forName 查找。 Array.newInstance(LinkedList.class, size)new LinkedList[size] 完全相同【参考方案2】:

这对我有用:

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));

是的,构造函数生成了一个警告(解释了“未检查”注释),但之后代码可以正常工作而没有更多警告。

【讨论】:

【参考方案3】:

只需使用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);
    

【讨论】:

以上是关于Java泛型:包含泛型的数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java泛型的一些知识点:Java泛型--泛型应用--泛型接口泛型方法泛型数组泛型嵌套

Java中数组和泛型的类型规则

Java 泛型的实际运用使用数组实现栈

java泛型的问题

Java讲课笔记35:初探泛型

Java 泛型