7

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

4

2 回答 2

4

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

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

但是,如果你需要让这个类作为两个不兼容的接口可替换,那就做不到了。

于 2013-06-18T16:35:55.697 回答
0

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

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

于 2013-06-18T16:37:59.217 回答