这是一个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){
} */
}
它给出了一个错误:错误:通用数组创建
谁能告诉我这是什么意思?希望有一些例子。
答案 0 :(得分:2)
由于在Java中实现泛型的方式,不可能使用泛型,因此在运行时需要类型信息。请参阅this。
答案 1 :(得分:2)
答案 2 :(得分:1)
正如大家所说,泛型类型在运行时被删除:
T
变为Object
,T extends SomeClass
变为SomeClass
。 所以你至少有两个选择
您可以使用ArrayList<T>
中使用的相同模式,并将项目存储在Object[]
数组中,而不是T[]
数组
vals = (T[]) new Object[size];
如果要创建真实T
类型的数组,则必须让用户传递与Class<T>
对应的T
对象的实例,并将其用作
vals = (T[]) java.lang.reflect.Array.newInstance(clazzT, size);
其中clazzT是Class<T>
实例。