Java泛型:找不到符号

时间:2014-12-25 15:54:09

标签: java generics

我想写一个模板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

我错过了什么吗?

4 个答案:

答案 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