Java 实现多个签名冲突的接口

Java 实现多个签名冲突的接口,java,collections,Java,Collections,最后,我尝试在Java中实现一种混合结构,如下所示: public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>> 公共类MapOfSet实现集合、映射 其中HasKey是以下接口: public interface HasKey<K> { public K getKey(); } 公共接口HasKey{ 公共K

最后,我尝试在Java中实现一种混合结构,如下所示:

public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>
公共类MapOfSet实现集合、映射
其中HasKey是以下接口:

public interface HasKey<K> {
    public K getKey();
}
公共接口HasKey{
公共K getKey();
}
不幸的是,Java中Set接口和Map接口的methodos签名之间存在一些冲突。我最终选择只实现Set接口,并添加Map方法而不实现这个接口

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

针对第一条评论,我的目标如下:

具有集合结构,并且能够有效地访问与给定键值相对应的该集合的值子集。 开始时,我实例化了一个map和一个set,但我尝试将这两个结构结合起来以优化性能


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

您试图实现什么
Map
已经通过其[keySet()](方法)将其键公开为
Set
。如果您想要可靠的迭代顺序,则有和

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

更新:类似的东西可以工作吗?(我没有我的编辑器,所以这可能无法编译)

public final类KeyedSets实现Map{
私有最终映射internalMap=新树映射;
//委托方法在这里
公共集getSortedSuperset(){
最终集超集=新树集();
for(最终的Map.Entry:internalMap.entrySet()){
superset.addAll(entry.getValue());
}
返回超集;
}
}

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

public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
    Set<V> havingKey(K k);
}
公共接口GroupedSet扩展集{
设置havingKey(K);
}
如果希望能够将集合用作映射,可以添加另一个方法

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

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

泛型的使用应该向您展示我希望做的事情:根据键对一组值进行排序,并使用映射轻松访问给定的值子集。因此,您能保证任意子集只有一个键吗?是的,当我创建子集时当然,使用原始post.yes中描述的HasKey接口的getKey方法,但是正如您所看到的,在我的例子中,containsValue的签名是containsValue(Set s)但是我需要检查并方便地访问V类的成员。在我的情况下,我并不真的需要接口,但我喜欢asMap的想法…我想我会借用这个。谢谢。
Map<K,Set<V>> asMap();