我写了一个TrieMap<V> implements Map<String,V>
类,显然是从字符串中键入来的。这很好用。
我希望将其增强为与更通用的CharSequence
相关联。我相信除了最后一个问题我已经设法实现了转换,我无法创建K
类型的对象。
现在签名必须变为TrieMap<K extends CharSequence,V> implements Map<K,V>
。问题是,我相信你知道,TrieMap
实际上并不存储原始密钥。 (事实上,这是它的主要价值之一,因此它通常比普通地图占用更少的空间。)
要实现Set<Entry<K, V>> entrySet()
,我必须以某种方式制造K
类型的对象。有什么办法可以实现吗?
答案 0 :(得分:3)
我将定义以下界面:
public interface KeyBuilder<K extends CharSequence> {
public K build(CharSequence value);
}
并提供TrieMap
构造函数的接口实现。当您需要构建新的K实例时,请求接口执行此操作。
您可能会使用更适合您的数据结构的东西作为build
方法的参数,CharSequence只是一种可能性。如果你想做一些更复杂的事情,你可以像这样构建它:
public interface KeyFactory<K extends CharSequence> {
public KeyBuilder<K> newBuilder();
}
public interface KeySequence<K extends CharSequence> {
public KeySequence<K> append(char value);
public K build();
}
String
实施:
public class StringKeyFactory<String> {
public KeyBuilder<String> newBuilder() {
return new KeyBuilder<String>() {
private final StringBuilder s = new StringBuilder();
public KeySequence<String> append(char value) {
s.append(value);
return this;
}
public String build() {
return s.toString();
}
};
}
}
答案 1 :(得分:0)
不,我不知道如果不在构造函数中使用Factory<K>
作为参数,它将如何成为可能。此Factory<K>
将负责根据您在K
中的元素创建TrieMap
的实例。