1

我写了一个TrieMap<V> implements Map<String,V>显然是从字符串键入的类。这工作正常。

我想用更通用的键来增强它CharSequence。我相信除了最后一个问题之外,我已经设法实现了转换,我无法创建 type 的对象K

因此,签名现在必须变为TrieMap<K extends CharSequence,V> implements Map<K,V>。问题是,我相信您知道,aTrieMap实际上并不存储原始密钥。(事实上​​,这是它的主要价值之一,因此它通常比普通地图占用更少的空间。)

因此,为了实现Set<Entry<K, V>> entrySet(),我必须以某种方式制造类型的对象K。有什么方法可以实现吗?

4

2 回答 2

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();
            }
        };
    }
}
于 2012-07-19T15:04:36.770 回答
0

Factory<K>不,我不明白如果在构造函数中不使用 as 参数怎么可能。这Factory<K>将负责K根据您在TrieMap.

于 2012-07-19T15:07:07.217 回答