我正在尝试构建一个实现Queue
和Map
的类。两个接口都定义了remove(Object)
方法,但具有不同的返回类型:
public interface Collection<E> { //Queue extends Collection, which has the problem method
public boolean remove(Object e);
//...
}
public interface Map<K,V> {
public V remove(K key);
//...
}
public class QueuedMap<K,V> extends AbstractMap implements Queue {
public V remove(K key) {/* ... */}
//ERROR: V is not compatible with boolean
//...
}
K的类型擦除导致这两个方法签名发生冲突。我不能拥有其中一个,因为它是一个无效的覆盖,我不能同时拥有它们,因为它们具有相同的签名。有什么方法可以让这两个接口共存?
答案 0 :(得分:4)
在这种特殊情况下,我不相信这是可能的。如果两个类都返回了Object类型,那么你有机会,但是由于你在混合基本类型和对象类型,所以没有兼容的类型可以支持这两个接口。
另一种方法可能是实现兼容的适当接口,然后使用组合来存储内部结构并根据需要将函数调用映射到该结构。这将假设您不需要满足或可用作两个接口,而是特别需要公开的接口。
但是,如果您需要将此类替换为两个不兼容的接口,则无法完成。
答案 1 :(得分:0)
您可以使用Queue所有的方法减去remove方法并使用它来制作您自己的界面MyQueue。您可以为MyQueue
接口提供一个Queue toQueue()
方法,该方法返回转换为队列的对象。
此转换过程可能只涉及返回匿名Queue
的新实例,对于每个方法X,它只会调用/返回this.
[X]。对于remove方法,您可以调用this.remove()
但返回布尔值而不是this.remove()
调用的返回值。