我想写一个模板HashTable
,它可以存储任何类型的记录。我正在使用Java泛型来做同样的事情。以下是HashTable
:
class MyHashTable <T, K>{
private int size;
private Vector <Vector <T>> table;
public MyHashTable(int s) {
size = s;
table = new Vector(size);
}
void insert(T newRecord) {
int hash = newRecord.getHash(size);
...
}
...
}
Folowing是我想要存储的记录类型的一个示例:
class Record {
private String name;
private String id;
public String getKey() {
return name;
}
public int getHash(int hash_table_size) {
int index = 0;
String key = getKey();
for(int i=0; i<key.length(); i++)
index += (int)key.charAt(i);
index = index % hash_table_size;
return index;
}
...
}
为了实例化HashTable,我写道:
MyHashTable <Record, String> hashTable = new MyHashTable(50);
编译代码时,出现以下错误:
HashTableImplementation.java:63: error: cannot find symbol
int hash = newRecord.getHash(size);
^
symbol: method getHash(int)
location: variable newRecord of type T
where T is a type-variable:
T extends Object declared in class MyHashTable
我错过了什么吗?
答案 0 :(得分:4)
您可以将定义更改为
class MyHashTable <T extends Record, K>
或在方法级别上执行类似操作
<T extends Record> void insert(T newRecord) {
int hash = newRecord.getHash(size);
}
通过添加有界参数,您将指示您只接受记录或其子类型的类型。并且您需要使用它,因为您正在针对参数化类型调用特定于 Record 类的方法
答案 1 :(得分:1)
您需要T extends Record
中的class MyHashTable <T, K> {
,因为newRecord
定义的类型T
当前与Record
无关。因此,它无法确定它具有方法getHash
。
答案 2 :(得分:0)
您已定义了通用类
class MyHashTable <T, K>{
使用类型参数T
。此类型参数是无界的,因此,在运行时,任何引用类型都可以绑定到它。
但是这里
void insert(T newRecord) {
int hash = newRecord.getHash(size);
...
}
您假设newRecord
属于Record
类型并且将采用newRecord
方法。这是一个错误的假设。
答案 3 :(得分:0)
不,您依赖哈希表中的冲突检测哈希码。所以你需要你的对象来实现hashCode函数..这是在Java规范中定义的。因此,将'getHash'更改为'hashCode',并且应该可以正常运行
d