Java 静态上下文中的非静态泛型类型

Java 静态上下文中的非静态泛型类型,java,generics,hashtable,Java,Generics,Hashtable,我正在用Java编写各种数据结构,为面试做准备。不过,我在静态上下文中使用泛型类型时遇到了一些麻烦。我有一个需要是静态的哈希函数,它接受一个泛型参数,但编译器没有。任何关于为什么会发生此错误以及如何更好地解决此问题的帮助都值得赞赏 public class Hashtable<K extends Comparable, T> { private int num_elem; private int num_buck; private ArrayList<L

我正在用Java编写各种数据结构,为面试做准备。不过,我在静态上下文中使用泛型类型时遇到了一些麻烦。我有一个需要是静态的哈希函数,它接受一个泛型参数,但编译器没有。任何关于为什么会发生此错误以及如何更好地解决此问题的帮助都值得赞赏

public class Hashtable<K extends Comparable, T> {
    private int num_elem;
    private int num_buck;
    private ArrayList<LinkedList<Pair<K, T>>> buckets;

    private class Pair<K, T> {
        K key;
        T value;

        Pair(K key, T value) {
            this.key = key;
            this.value = value;
        }
    }

    public Hashtable(int size) {
        this.num_elem = size;
        this.num_buck = (int) (num_elem * 1.2);
        this.buckets = new ArrayList<LinkedList<Pair<K, T>>>();

        for (int i = 0; i < num_buck; i++)
            buckets.add(new LinkedList<Pair<K, T>>());
    }

    public static int hash(K key) {
        return (System.identityHashCode(key) * num_buck) / 97;
    }

    public static int compress(int hashval) {
        return hashval % num_buck;
    }

    public void add(K key, T value) {
        Pair p = new Pair<K, T>(key, value);
        int hashval = Hashtable.hash(key);
        buckets.get(Hashtable.compress(key)).add(p);
    }

    public T find(K key) throws exception {
        int hashval = Hashtable.hash(key);
        LinkedList<Pair<K, T>> ll = buckets.get(Hashtable.compress(hashval));

        Iterator iter = ll.iterator();

        while (iter.hasNext()) {
            Pair<K, T> p = iter.Next();

            if (p.key.compareTo(key) == 0)
                return p.value;
        }

        throw new Exception("Key not in HashTable");
    }

    public void remove(K key) {
    }

    public static void main(String[] args) {
    }
}
公共类哈希表{
私有内部元素;
私人有限公司;
私有数组列表桶;
私有类对{
K键;
T值;
配对(K键,T值){
this.key=key;
这个值=值;
}
}
公共哈希表(整数大小){
this.num_elem=大小;
这个.num_buck=(int)(num_elem*1.2);
this.bucket=新的ArrayList();
对于(int i=0;i
正如前面所指出的,您缺少了
散列方法的结束符
}
。但是,静态方法无法引用类的类型参数,否则会出现错误:

non-static class K cannot be referenced from a static context
但是看起来,
hash
方法不需要是泛型的。取而代之的应该是
对象

public static int hash(Object key)

“编译器没有它”不是一个有效的问题。啊,好吧。我考虑过这一点,但总是回避使用泛型对象类。我一直以为你想避免那样。这是这种情况下的标准解决方案吗?缺少的括号是一个复制粘贴问题,我现在已经在帖子中修复了它。或者,如果您真的想使用泛型,可以简单地使用
public static int hash(K key)
,然后从参数中推断出类型。好吧,这里您没有执行任何特定于
K
的操作,例如返回
K
,布莱恩:谢谢,这也行,更符合我的想法。不过,这种语法到底是什么,我以前从未见过static之后的泛型类型。不幸的是,这导致了非静态变量(num_buck)的另一个问题,我无法将其设置为静态变量。我的哈希表方法本身有缺陷吗?要使用
num_buck
,请将其作为另一个参数传递给
hash
方法。