2013-06-18 14 views
7

Sto provando a creare una classe che implementa Queue e Map. Entrambe le interfacce definiscono il metodo remove(Object), ma con differenti tipi di ritorno:Implementazione di interfacce incompatibili

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 

    //... 
} 

La cancellazione del tipo di K sta causando questi due firme di metodo di collisione. Non posso averne uno perché è un override non valido e non posso averli entrambi perché hanno la stessa firma. C'è un modo per far coesistere queste due interfacce?

+0

dal polsino, non mi sembra possibile. –

+0

Come deciderà la tua classe quale usare, se hai chiamato remove (chiave)? –

+0

[Non sembra buono] (http://stackoverflow.com/questions/573621/is-the-c-sharp-explicit-implementation-of-the-interface-present-in-java) –

risposta

4

Non credo sia possibile in questo caso particolare. Se entrambe le classi restituiscono i tipi di oggetto avresti qualche possibilità, ma dal momento che stai mescolando i tipi di base e di oggetto, non esiste un tipo compatibile che supporti entrambe le interfacce.

Un approccio diverso può essere quello di implementare interfacce appropriate che sono compatibili, quindi utilizzare la composizione per memorizzare una struttura interna e le chiamate della funzione di mappatura a tale secondo necessità. Ciò presuppone che non è necessario soddisfare o essere utilizzabili come entrambe le interfacce, ma piuttosto che quella in particolare è quella che è necessario esporre.

Tuttavia, se è necessario rendere questa classe sostituibile come due interfacce incompatibili, non è possibile eseguirla.

0

È possibile creare la propria interfaccia MyQueue con tutti i metodi che Queue ha meno il metodo di rimozione e utilizzarlo. È possibile assegnare all'interfaccia MyQueue un metodo Queue toQueue() che restituisca l'oggetto convertito in una coda.

Questo processo di conversione potrebbe comportare il ritorno di una nuova istanza di un anonimo Queue, che, per ogni metodo X, chiamerebbe semplicemente/restituire this. [X]. Per il metodo di rimozione si chiama this.remove(), ma si restituisce un valore booleano anziché il valore restituito della chiamata this.remove().

+0

È improbabile che essere utile. Lo scopo dell'implementazione di 'java.util.Queue' è che le istanze di questa classe possano essere passate in metodi che si aspettano un' java.lang.Queue'. L'implementazione di 'MyQueue' non raggiungerà questo obiettivo. –

+0

@AndrzejDoyle Sono d'accordo, ma nella remota possibilità che questa soluzione possa funzionare per il caso d'uso dell'OP o scatenare ulteriori discussioni ho pensato di pubblicarlo –

Problemi correlati