创建自定义哈希表

Sae*_*eed 1 java generics hashtable

我需要创建一个自定义Hashtable扩展java.lang.Hashtable,我需要重写get方法来实现以下行为:

  1. 如果key == null,它将返回V类型的新对象
  2. 如果super.get(key)== null,它还将返回一个V类型的新对象.

谁能帮我.我试着这样做,但我知道这是错的.

import java.util.Hashtable;

public class CustomHashtable<K, V> extends Hashtable {
    @Override
    public synchronized V get(Object key) {
        if(key == null) return new Object();
        Object v = super.get(key);
        if(v == null){
            return new Object();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

请看行:

if(key == null) return new Object();
Run Code Online (Sandbox Code Playgroud)

和行:

if(v == null){
    return new Object();
}
Run Code Online (Sandbox Code Playgroud)

知道错误发生的位置..

Jon*_*eet 10

您必须存储与V相关的类并创建新实例.例如:

public class CustomHashtable<K, V> extends Hashtable {
    Class<V> clazz;

    public CustomHashtable(Class<V> clazz) {
        this.clazz = clazz;
    }

    @Override
    public synchronized V get(Object key) {
        if(key == null) return newValue();
        Object v = super.get(key);
        if(v == null){
            return newValue();
        }
    }

    private V newValue() {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException (e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException (e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(当然,您可能希望更改异常处理.)

另一种方法是让调用者有效地提供工厂来创建新的实例V.您可以使用以下界面执行此操作:

public interface Factory<T> {
    T create();
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将工厂存储在自定义哈希表中,并create在需要时随时调用.