2012-07-16 20 views
8

Ho un Map le cui chiavi sono di tipo generico Key<T> e i valori sono di tipo List<T>. Se la chiave è un'istanza di Key<String>, il valore deve essere un List<String> e la stessa regola si applica a qualsiasi altra coppia chiave-valore. Ho provato quanto segue ma non viene compilato:Come dichiarare una mappa con generici variabili?

Map<T, List<T>> map; 

Attualmente devo dichiarare che con i generici "parziali":

Map<Object, List> map; 

So che questo è male, ma io al momento non hanno alcuna scelta migliore . È possibile utilizzare i generici in questa situazione?

UPDATE

Forse non ha espresso chiaramente il mio problema. Voglio una mappa che è in grado di:

map.put(new Key<String>(), new ArrayList<String>()); 
map.put(new Key<Integer>(), new ArrayList<Integer>()); 

E il seguente codice non dovrebbe compilare:

map.put(new Key<String>(), new ArrayList<Integer>()); 

La chiave e il valore dovrebbe sempre avere lo stesso tipo generico, mentre il tipo generico può essere qualsiasi, e ovviamente estendere una mappa non soddisfa il mio requisito.

+0

spazio non dovrebbe essere il problema. È probabilmente il modo in cui viene utilizzato. L'OP deve mostrare più codice da riparare. – Nishant

+0

Si stanno usando i tasti di tipo 'T', o i tasti di tipo' Chiave '? –

+0

Con il tuo scenario attuale, dovresti usare l'incapsulamento per risolvere il tuo problema come affermano Nishant e Geoff nelle loro risposte, basta adattarlo al tuo codice reale. –

risposta

7

Non sono a conoscenza di alcuna libreria esistente che esegue esattamente questo, ma non è troppo difficile da implementare. Ho fatto qualcosa di simile un paio di volte in passato. Non è possibile utilizzare l'interfaccia Mappa standard ma è possibile utilizzare una mappa hash per implementare la classe. Per iniziare, potrebbe essere qualcosa del genere:

public class KeyMap { 
    public static class Key<T> { } 

    private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>(); 

    public <T> void put(Key<T> k, List<T> v) { 
    values.put(k, v); 
    } 

    public <T> List<T> get(Key<T> k) { 
    return (List<T>)values.get(k); 
    } 

    public static void main(String[] args) { 
    KeyMap a = new KeyMap(); 
    a.put(new Key<String>(), new ArrayList<String>()); 
    a.get(new Key<Integer>()); 
    } 
} 
+0

In realtà stai avvolgendo la mia 'Mappa > mappa' in un'altra classe.Sembra che una semplice mappa non possa soddisfare il mio requisito, quindi questa potrebbe essere l'ultima scelta. Grazie! –

4

Questo è ciò che si vuole:

public class Test<T> extends HashMap<T, List<T>> 
{ 
} 

Se non si desidera un HashMap come la classe Super poi cambiarlo in qualsiasi classe concreta che si desidera.

+0

Si prega di consultare il mio aggiornamento. –

+0

Ho cambiato la mia risposta. – Brad

+0

Ma come potrei usare solo un'istanza di 'Test' per archiviare i miei dati? –

Problemi correlati