实现几个签名冲突的接口

时间:2008-09-16 09:32:03

标签: java collections

Lasty,我尝试用Java实现混合结构,看起来像:

public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>

其中HasKey是以下界面:

public interface HasKey<K> {
    public K getKey();
}

不幸的是,Set接口的methos签名和Java中的Map接口之间存在一些冲突。我最终选择只实现Set接口并添加Map方法而不实现此接口。

你看到更好的解决方案吗?

回应第一条评论,这是我的目标:

  

具有集合结构,并且能够有效地访问该集合的值的子集,对应于给定的键值。   一开始我实例化了一个地图和一个集合,但我试图加入这两个结构来优化性能。

3 个答案:

答案 0 :(得分:3)

你想要完成什么? Map已通过其[keySet()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet())方法将其密钥公开为Set。如果您需要可靠的迭代订单,则LinkedHashMap和{{3} }。

更新:如果你想确保一次只插入一个值,你可以扩展我上面提到的一个类来创建类似SingleEntryMap的类,并覆盖put(K key, V value)的实现执行唯一性检查并在插入值时抛出异常。

更新:这样的事情会起作用吗? (我没有编辑,所以这可能无法编译)

public final class KeyedSets<K, V> implements Map<K,Set<V>> {
    private final Map<K, Set<V>> internalMap = new TreeMap<K, Set<V>>;
    // delegate methods go here
    public Set<V> getSortedSuperset() {
        final Set<V> superset = new TreeSet<V>();
        for (final Map.Entry<K, V> entry : internalMap.entrySet()) {
            superset.addAll(entry.getValue());
        }
        return superset;
    }
}

答案 1 :(得分:1)

也许您可以添加更多您真正想要的操作信息。我想你想创建一个用键自动分组元素的集合,对吧?问题是您希望能够拥有哪些操作?如何将元素添加到集合中?可以通过从分组视图中删除元素来删除它们吗?我的建议是这样的界面:

public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
    Set<V> havingKey(K k);
}

如果您希望能够使用Set as map,则可以添加其他方法

Map<K,Set<V>> asMap();

这避免了使用多个接口继承以及由此产生的问题。

答案 2 :(得分:0)

我想说有时候用作Map的东西,有时用作Set的东西应该实现Map,因为它可以被视为一组键或值以及键和值之间的映射。这就是Map.containsKey()和Map.containsValue()方法的用途。