2013-06-18 36 views
7

我正在嘗試構建一個實現QueueMap的類。這兩個接口定義remove(Object)的方法,但不同的返回類型:K的實現不兼容的接口

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 

    //... 
} 

類型擦除造成這兩個方法簽名碰撞。我不能擁有其中的一個,因爲它是一個無效的覆蓋,而我不能擁有這兩個,因爲它們具有相同的簽名。有什麼辦法可以讓這兩個界面共存嗎?

+0

關閉袖口,它似乎不可能對我。 –

+0

如果你叫remove(key),你的班級將如何決定使用哪一個? –

+0

[看起來不好](http://stackoverflow.com/questions/573621/is-the-c-sharp-explicit-implementation-of-the-interface-present-in-java) –

回答

4

我不相信在這種特殊情況下這是可能的。如果這兩個類都返回了Object類型,那麼您就有機會了,但由於您混合了基本類型和對象類型,因此沒有可支持這兩種接口的兼容類型。

不同的方法可能是實現相應的適當接口,然後使用組合來存儲內部結構並根據需要映射函數調用。這會假設你不需要滿足或者可以同時用作這兩個接口,而是特別需要揭示一個接口。

但是,如果您需要將此類替換爲兩個不兼容的接口,則無法完成此操作。

0

您可以使用Queue所有的方法創建自己的接口MyQueue,並減去remove方法並使用它。您可以給MyQueue接口一個Queue toQueue()方法,該方法返回轉換爲隊列的對象。

這個轉換過程可能涉及到剛剛返回一個匿名Queue的新實例,對於每個方法X,它只會簡單地調用/返回this. [X]。對於刪除方法,您可以調用this.remove(),但返回一個布爾值而不是返回值this.remove()調用。

+0

這是不太可能有用。實現'java.util.Queue'的目的是讓這個類的實例可以被傳遞到期望java.lang.Queue的方法中。實現'MyQueue'不會實現這一點。 –

+0

@AndrzejDoyle我同意,但是如果這個解決方案可能適用於OP的用例或激發進一步的討論,我想我會發布它 –