2011-10-19 61 views
7

我在一个类中实现了Map<V,K>Collection<V>接口,但remove(Object)方法发生在两个接口中,因此Eclipse会显示一些错误。返回类型是不同的,一个返回boolean和另一个V但这似乎并不重要。Java覆盖两个接口,方法名称冲突

是否有告知的Java /月食的一些方法哪种方法实际上是被重写?

编辑:我已经得到了所有值必须实现一个接口,它以信息getKey()方法提供值,从而可以写在地图的加载功能。但是似乎没有办法让这一堂课同时看起来像地图和藏品?

+0

你可能想说出你打算做什么。 “Map”基本上是一个键值字典。 “集合”只是一堆东西。他们在概念上根本不是一回事。你的意思是你想要一个'Map',它的*键*可以作为'Collection'被访问?因为'keySet()'就是这样做的。 –

回答

8

不,没有直接的办法。

其实动态绑定考虑到了签名不包括返回类型,以便Java编译器不能接受对具有相同签名但不同返回类型同一类的两种方法。如果两个方法具有相同的名称和相同的参数,则它们必须也具有相同的返回类型,不幸的是对您而言。

唯一的办法是将行为分成两个不同的类并组成它们。也许像Collection<V> asCollection()或类似的方法。

+0

以下是有关方法签名的JLS文档:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2 – rit

1

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

您应该考虑使用compositiondelegation而不是至少在两个接口之一继承,或者你可以在两个类中拆分你的类的功能,这真的取决于你的具体问题。

+0

如果我让我的Map类继承Collection类并在Collection类中设置remove方法final,我仍然会在Map类中得到错误。或者我应该如何使用这个作品? –

+0

如果你让你的“Map类扩展集合”,你正在使用继承。如果你想要做的事实质上是一个带有一些自定义差异的Map,那么它只能扩展一个Map,如果你需要一个内部的集合来实现某些功能,你可以将该Collection声明为一个私有变量,并且暴露一些必要的方法,如有必要,通过使用委派。您可以定义一个方法,只需将您的私有变量上的类似方法传递给该方法即可。 – stivlo

+0

谢谢,我明白了,但是当我使用委托时,我的班级放弃了真实收藏的外观。应用程序使用此实现应该很简单,而不必担心必须调用一些toCollection()方法。但这似乎是不可能的。 –

1

Map已经keySet()这是领取钥匙。你为什么还需要收藏品?如果是这样,只要做两种方法,如asMapasCollecton,它们返回不同的类型。

+0

我正在编写自定义add()方法地图。 –

+0

和?..你总是可以做'yourObject.asMap().add(.. custom ..)'。 – kan

0

你可能需要组成,而不是继承。不幸的是,Java没有语言层面的支持 - 我的意思是可以完成但不必要的费力。

0

您需要重新考虑您的设计。从根本上说,地图与集合不同。考虑一下Collection.add()方法。添加没有键或没有值的键的对象是否有意义?

你最好的赌注(我想,这取决于你的应用程序)是实现一个地图,当你需要一个集合,使用它的方法获取一组键,值或键值对的。

+0

看看我的编辑,有一个接口提供了从一个值获取密钥的方法。我知道我想要做什么,唯一的问题是:-) –

+0

'add'只是一个例子。我的评论的立场。 – JeremyP