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

时间:2011-10-19 09:13:17

标签: java collections map override implements

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

有没有办法告诉java / eclipse哪个方法实际被覆盖?

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

5 个答案:

答案 0 :(得分:8)

不,没有直接的方法。

实际上,动态绑定会考虑不包括返回类型的签名,因此Java编译器不能为具有相同签名但返回类型不同的同一类接受这两种方法。如果两个方法具有相同的名称和相同的参数,那么它们也必须具有相同的返回类型,不幸的是你。

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

答案 1 :(得分:1)

不,没有办法解决此类冲突。

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

答案 2 :(得分:1)

Map已经有keySet()这是密钥集合。你为什么还需要收藏品呢?如果是这样,只需执行两种方法,例如asMapasCollecton,它们会返回不同的类型。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

你最好的选择(我认为并且取决于你的应用程序)是实现一个地图,但是当你需要一个集合时,使用它的一种方法来获得一组键,值或键值对。