7

我在一个类中实现Map<V,K>andCollection<V>接口,但是该remove(Object)方法出现在两个接口中,因此 eclipse 向我显示了一些错误。返回类型不同,一种返回boolean,另一种返回,V但这似乎无关紧要。

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

编辑:我有一个所有值都必须实现的接口,它通过 getKey() 方法提供值,从而可以为地图编写添加函数。但是好像没有办法让这个类同时看起来像一个map和一个collection?

4

5 回答 5

8

不,没有直接的方法。

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

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

于 2011-10-19T09:19:10.913 回答
1

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

您应该考虑对两个接口中的至少一个使用组合委托而不是继承,或者您可以将类的功能拆分为两个类,这实际上取决于您的具体问题。

于 2011-10-19T09:15:57.963 回答
1

Map已经拥有的keySet()是密钥的集合。为什么还需要 Collection?如果是这样,只需执行两种方法,例如asMapand asCollecton,它们确实返回不同的类型。

于 2011-10-19T09:20:35.523 回答
0

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

于 2011-10-19T09:29:29.003 回答
0

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

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

于 2011-10-19T09:35:28.577 回答