背景
对于课程,我制作了一个线性链接哈希表。它存储一组链表,每当调用get或put时,键都会被数组大小进行散列和模数化。然后在结果链表上调用get或put(我也实现了)。
我有一个ST
(符号表)界面。它与Map
非常相似,但Map
所需的一些操作对我来说太难以实现了。实现此接口我实现了链表,红黑树,线性探测哈希表和线性链接哈希表。
我想做一个类似于线性链接哈希表的东西,它接受一个任意的委托符号表类型。例如,使用红黑树类型初始化它会生成一个红黑树表,而get和put函数将委托给那些红黑树。
我认识到我的实现几乎肯定比库提供的实现慢,而且我最好在实际代码中使用它们。我只是想尝试和学习。
问题
向哈希表提供类型的最佳方法是什么,以便哈希表由该类型的表组成,并且调用将委托给那些符号表?
我不能使用泛型,因为我无法初始化那些,我需要初始化构造和重新调整大小。
我考虑过提供一个所需类型的空白符号表,然后使用copy
方法,但似乎应该有更好的方法。有吗?
答案 0 :(得分:4)
您可能还需要提供Factory
来创建所需背景结构的实例。
Map
代表另一个Map
的简单示例:
public static interface Supplier<T> {
T get();
}
public static class DelegatingMap<K, V> implements Map<K, V> {
private final Map<K, V> backingMap;
public DelegatingMap(final Supplier<Map<K, V>> backingMapSupplier) {
backingMap = backingMapSupplier.get();
}
@Override
public int size() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean isEmpty() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
//etc...
}
答案 1 :(得分:2)
由于类型擦除,在运行时对象不会自动跟踪其类型参数,这就是new T()
无法编译的原因。
您可以通过要求调用者为您提供type参数的Class
对象来解决此问题,然后您可以使用该对象创建新实例。当然,使用反射绕过编译时检查(特别是,编译器不会检查符号表实现是否具有所需的构造函数),以及IDE可能提供的任何静态分析(构造函数上的调用层次结构不会显示任何来电者。)
或者,您可以要求调用者为您提供工厂对象,该工厂对象可以按需创建符号表实现。这样更灵活(例如,调用者可以选择构造函数参数)和静态类型安全,但也更冗长...