2011-10-19 3 views
7

Sto implementando l'interfaccia Map<V,K> e l'interfaccia Collection<V> in una classe, ma il metodo remove(Object) si verifica in entrambe le interfacce, pertanto eclipse mi mostra alcuni errori. I tipi di reso sono diversi, uno restituisce boolean e l'altro V ma ciò non sembra avere importanza.Java che sostituisce due interfacce, il clangore dei nomi del metodo

C'è un modo per dire a java/eclipse quale metodo viene effettivamente sottoposto a override?

EDIT: Ho un'interfaccia che tutti i valori devono implementare, fornisce il valore con un metodo getKey(), rendendo possibile scrivere una funzione di aggiunta per la mappa. Ma sembra che non ci sia modo di lasciare che questo aspetto di una classe sia una mappa e una collezione allo stesso tempo?

+0

Si potrebbe voler dire cosa si intende fare. Una 'Mappa' è fondamentalmente un dizionario chiave-valore. Una 'Collezione' è solo un mucchio di cose. Non sono concettualmente la stessa cosa. Intendi dire che vuoi una 'Mappa' di cui * chiavi * è accessibile come' Collezione'? Perché 'keySet()' lo fa ad esempio. –

risposta

8

No, non esiste un modo diretto.

Attualmente il bind dinamico tiene conto della firma escludendo il tipo restituito in modo che il compilatore Java non possa accettare i due metodi per la stessa classe che hanno la stessa firma ma tipi di ritorno diversi. Se due metodi hanno gli stessi nomi e gli stessi parametri di DEVE avere anche lo stesso tipo di ritorno, sfortunatamente per te.

L'unico modo è dividere il comportamento in due classi diverse e comporle. Forse un metodo come Collection<V> asCollection() o qualcosa del genere.

+0

Ecco la documentazione del JLS relativa alla firma del metodo: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2 – rit

1

No, non esiste un modo per risolvere tali conflitti.

Si dovrebbe prendere in considerazione di utilizzare composition e delegation invece di eredità per almeno una delle due interfacce, oppure si potrebbe dividere la funzionalità della classe in due classi, in realtà dipende il vostro problema concreto.

+0

Se faccio in modo che la mia classe Map estenda la classe Collection e imposti il ​​metodo remove final nella classe Collection, ottengo ancora errori nella classe Map. O come dovrei usare la composizione? –

+0

Se si effettua la "classe di mappe estende la raccolta" si utilizza l'ereditarietà. Se quello che stai cercando di fare è essenzialmente una mappa con alcune differenze personalizzate, fai estendere solo una mappa e se hai bisogno di una raccolta internamente per alcune funzionalità, puoi dichiararla come variabile privata ed esporre anche alcune di esse i metodi necessari, se necessario, utilizzando la delega.Si definisce un metodo che passa semplicemente la chiamata su un metodo simile sulla variabile privata. – stivlo

+0

Grazie, ma quando uso la delega della mia classe perde l'aspetto di una vera collezione. Dovrebbe essere semplice per le applicazioni utilizzare questa implementazione senza preoccuparsi di dover chiamare un metodo toCollection(). Ma questo sembra impossibile. –

1

Il Map ha già keySet() che è la raccolta di chiavi. Perché hai bisogno anche della Collezione? Se è così, basta fare due metodi come asMap e asCollecton che restituiscono tipi diversi.

+0

Sto scrivendo un metodo add() personalizzato per la mappa. –

+0

E? .. Si potrebbe sempre fare 'yourObject.asMap(). Add (.. custom ..)'. – kan

0

Probabilmente hai bisogno di composizione invece di ereditarietà. Sfortunatamente Java non ha un supporto a livello di linguaggio per questo - voglio dire che può essere fatto ma è inutilmente laborioso.

0

Hai bisogno di ripensare il tuo design. Fondamentalmente, una mappa è diversa da una collezione. Pensa al metodo Collection.add(). Ha senso aggiungere un oggetto senza una chiave o una chiave senza un valore a una mappa?

La tua migliore scommessa (penso e in base alla tua applicazione) è implementare una mappa ma quando hai bisogno di una collezione, usa uno dei suoi metodi per ottenere l'insieme di chiavi, valori o coppie di valori chiave.

+0

Guarda la mia modifica, c'è un'interfaccia che fornisce un metodo per ottenere una chiave da un valore. So cosa voglio fare, l'unica domanda è come :-) –

+0

'add' era solo un esempio. Il mio commento è valido – JeremyP