HashTable泛型数组创建错误

时间:2013-04-02 14:38:22

标签: java

这是一个12年级的Java HashTable作业。

所以我的老师给了我执行此作业的模板,但它不起作用:(。他希望我们让模板工作然后完成作业。

这是他给我们的:

class MyHashTable<T>{
    private T[] vals;
    private int load;
    public MyHashTable(){
        load = 0;
        vals = new T[10];
    }
    public MyHashTable(int size){
        load = 0;
        vals = new T[size];
    }
    public void add(T obj){//don't care about negatives
        int size = vals.length;
        if((load+1.0)/size>0.6){
            size*=10;
            T[] tmp = new T[size];
            for(int i=0;i<size/10;i++){
                if(vals[i]!=null){
                    add(vals[i], tmp);
                }
            }
            vals = tmp;
        }
        add(obj, vals);
    }
    public void add(T obj, T[]vals){
        int loc = Math.abs(obj.hashCode())%vals.length;
        while(vals[loc]!=null){
            loc = (loc+1)%vals.length;
        }
        vals[loc] = obj;
    }
    /*public boolean contains(T obj){

    } */
}

它给出了一个错误:错误:通用数组创建

谁能告诉我这是什么意思?希望有一些例子。

3 个答案:

答案 0 :(得分:2)

由于在Java中实现泛型的方式,不可能使用泛型,因此在运行时需要类型信息。请参阅this

答案 1 :(得分:2)

  

错误:通用数组创建

您无法使用泛型类型创建数组。

另见What's the reason I can't create generic array types in Java?

答案 2 :(得分:1)

正如大家所说,泛型类型在运行时被删除:

  • T变为Object
  • T extends SomeClass变为SomeClass

所以你至少有两个选择

  1. 您可以使用ArrayList<T>中使用的相同模式,并将项目存储在Object[]数组中,而不是T[]数组

    vals = (T[]) new Object[size];
    
  2. 如果要创建真实T类型的数组,则必须让用户传递与Class<T>对应的T对象的实例,并将其用作

    vals = (T[]) java.lang.reflect.Array.newInstance(clazzT, size); 
    
  3. 其中clazzT是Class<T>实例。