实现不兼容的接口

时间:2013-06-18 16:19:16

标签: java inheritance interface type-erasure

我正在尝试构建一个实现QueueMap的类。两个接口都定义了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的类型擦除导致这两个方法签名发生冲突。我不能拥有其中一个,因为它是一个无效的覆盖,我不能同时拥有它们,因为它们具有相同的签名。有什么方法可以让这两个接口共存?

2 个答案:

答案 0 :(得分:4)

在这种特殊情况下,我不相信这是可能的。如果两个类都返回了Object类型,那么你有机会,但是由于你在混合基本类型和对象类型,所以没有兼容的类型可以支持这两个接口。

另一种方法可能是实现兼容的适当接口,然后使用组合来存储内部结构并根据需要将函数调用映射到该结构。这将假设您不需要满足或可用作两个接口,而是特别需要公开的接口。

但是,如果您需要将此类替换为两个不兼容的接口,则无法完成。

答案 1 :(得分:0)

您可以使用Queue所有的方法减去remove方法并使用它来制作您自己的界面MyQueue。您可以为MyQueue接口提供一个Queue toQueue()方法,该方法返回转换为队列的对象。

此转换过程可能只涉及返回匿名Queue的新实例,对于每个方法X,它只会调用/返回this. [X]。对于remove方法,您可以调用this.remove()但返回布尔值而不是this.remove()调用的返回值。