Java重写两个接口,方法名称冲突

Java重写两个接口,方法名称冲突,java,collections,map,overriding,implements,Java,Collections,Map,Overriding,Implements,我在一个类中实现了Map和Collection接口,但是remove(Object)方法出现在两个接口中,因此eclipse向我显示了一些错误。返回类型不同,一个返回boolean,另一个返回V,但这似乎并不重要 是否有某种方法可以告诉java/eclipse实际覆盖了哪个方法 编辑:我有一个所有值都必须实现的接口,它使用getKey()方法提供值,从而可以为映射编写一个add函数。但是似乎没有办法让这个类同时看起来像一个映射和一个集合?不,没有办法解决这种冲突 你应该考虑使用和代替继承至少两个

我在一个类中实现了
Map
Collection
接口,但是
remove(Object)
方法出现在两个接口中,因此eclipse向我显示了一些错误。返回类型不同,一个返回
boolean
,另一个返回
V
,但这似乎并不重要

是否有某种方法可以告诉java/eclipse实际覆盖了哪个方法


编辑:我有一个所有值都必须实现的接口,它使用getKey()方法提供值,从而可以为映射编写一个add函数。但是似乎没有办法让这个类同时看起来像一个映射和一个集合?

不,没有办法解决这种冲突


你应该考虑使用和代替继承至少两个接口中的一个,或者你可以把你的类的功能分成两个类,这确实取决于你的具体问题。

< P>不,没有直接的方式。< /P> 实际上,动态绑定考虑了不包括返回类型的签名,因此Java编译器不能接受具有相同签名但不同返回类型的同一类的两个方法。如果两个方法具有相同的名称和参数,那么它们也必须具有相同的返回类型,这对您来说很不幸


唯一的方法是将行为分为两个不同的类并组合它们。可能是像
Collection asCollection()
之类的方法。
Map
已经有了
keySet()
,它是键的集合。你为什么还需要这些收藏品?如果是这样,只需执行两种方法,例如
asMap
asCollecton
,它们返回不同的类型。

您可能需要组合而不是继承。不幸的是,Java没有语言级别的支持,我的意思是这是可以做到的,但这是不必要的费力

你需要重新思考你的设计。从根本上说,地图不同于集合。考虑Collection.add()方法。将没有键的对象或没有值的键添加到贴图中有意义吗


您的最佳选择(我认为,这取决于您的应用程序)是实现一个映射,但当您需要一个集合时,请使用它的一种方法来获取一组键、值或键值对。

您可能想说明您打算做什么。
Map
基本上是一个键值字典。一个
集合
只是一堆东西。它们在概念上根本不是一回事。你的意思是你想要一个
地图
,它的键可以作为
集合
访问吗?例如,
keySet()
就是这样做的。我正在为map.And?编写一个自定义add()方法?。。您始终可以执行
yourObject.asMap().add(…custom..)
。如果我让我的Map类扩展集合类并在集合类中设置remove方法final,则Map类中仍然会出现错误。或者我应该如何使用组合?如果您使用“Map class extends Collection”,那么您使用的是继承。如果您试图做的本质上是一个具有一些自定义差异的映射,那么让它只扩展一个映射,并且如果您在内部需要一个集合来实现某些功能,那么您可以将该集合声明为一个私有变量,并在必要时通过使用委托公开一些所需的方法。您定义了一个方法,该方法只传递对私有变量上类似方法的调用。谢谢,我明白了,但是当我使用委托时,我的类失去了真实集合的外观。应用程序使用此实现应该很简单,而不必担心必须调用某些toCollection()方法。但这似乎是不可能的。以下是JLS关于方法签名的文档:看看我的编辑,有一个接口提供了从值中获取密钥的方法。我知道我想做什么,唯一的问题是如何:-)
add
只是一个例子。我的意见是正确的。