Implementa diverse interfacce con conflitti nelle firme
-
09-06-2019 - |
Domanda
Infine, ho provato a implementare una struttura ibrida in Java, qualcosa che assomigli a:
public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>
Dove HasKey è la seguente interfaccia:
public interface HasKey<K> {
public K getKey();
}
Sfortunatamente, ci sono alcuni conflitti tra la firma dei metodi dell'interfaccia Set e l'interfaccia Map in Java.Alla fine ho scelto di implementare solo l'interfaccia Set e di aggiungere il metodo Map senza implementare questa interfaccia.
Vedete una soluzione migliore?
In risposta ai primi commenti, ecco il mio obiettivo:
Avere una struttura fissa ed essere in grado di accedere in modo efficiente a un sottoinsieme di valori di questo insieme, corrispondente a un dato valore chiave.All'inizio ho istanziato una mappa e un set, ma ho cercato di unire le due strutture per ottimizzare le prestazioni.
Soluzione
Forse potresti aggiungere ulteriori informazioni su quali operazioni desideri veramente.Immagino che tu voglia creare un set che raggruppi automaticamente i loro elementi in base a una chiave, giusto?La domanda è: quali operazioni vuoi poter avere?Come vengono aggiunti gli elementi al Set?È possibile eliminare gli elementi rimuovendoli da una vista raggruppata?La mia proposta sarebbe un'interfaccia del genere:
public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
Set<V> havingKey(K k);
}
Se vuoi poter utilizzare Imposta come mappa puoi aggiungere un altro metodo
Map<K,Set<V>> asMap();
Ciò evita l'uso dell'ereditarietà di più interfacce e i problemi che ne derivano.
Altri suggerimenti
Cosa stai cercando di realizzare? Map
espone già le sue chiavi come a Set
tramite il suo [keySet()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) metodo.Se vuoi un ordine iterativo affidabile, c'è LinkedHashMap E Mappa ad albero.
AGGIORNAMENTO:Se vuoi assicurarti che un valore sia stato inserito una sola volta, puoi estendere una delle classi che ho menzionato sopra per creare qualcosa come un SingleEntryMap
e sovrascrivere l'implementazione di put(K key, V value)
per eseguire un controllo di unicità e lanciare un'eccezione quando il valore è già stato inserito.
AGGIORNAMENTO:Funzionerà qualcosa del genere?(Non ho il mio editor attivo, quindi questo potrebbe non essere compilato)
public final class KeyedSets<K, V> implements Map<K,Set<V>> {
private final Map<K, Set<V>> internalMap = new TreeMap<K, Set<V>>;
// delegate methods go here
public Set<V> getSortedSuperset() {
final Set<V> superset = new TreeSet<V>();
for (final Map.Entry<K, V> entry : internalMap.entrySet()) {
superset.addAll(entry.getValue());
}
return superset;
}
}
Direi che qualcosa che è pensato per essere usato a volte come una mappa e talvolta come un set dovrebbe implementare Map, poiché può essere visto come un insieme di chiavi o valori nonché una mappatura tra chiavi e valori.Questo è lo scopo dei metodi Map.containsKey() e Map.containsValue().