1

这是 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){

    } */
}

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

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

4

3 回答 3

2

由于泛型在 Java 中实现的方式,不可能使用泛型,以便在运行时需要类型信息。看到这个

于 2013-04-02T14:41:08.650 回答
2

错误:创建通用数组

您不能从泛型类型创建数组。

另请参阅我无法在 Java 中创建泛型数组类型的原因是什么?

于 2013-04-02T14:43:44.337 回答
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); 
    

其中 clazzT 是Class<T>实例。

于 2013-04-02T15:03:05.303 回答