2012-07-16 4 views
8

Ich habe eine Map, deren Schlüssel vom generischen Typ sind Key<T>, und Werte sind vom Typ List<T>. Wenn der Schlüssel eine Instanz von Key<String> ist, muss der Wert List<String> lauten, und die gleiche Regel gilt für alle anderen Schlüssel/Wert-Paare. Ich habe folgendes versucht, aber es lässt sich nicht kompilieren:Wie deklariert man eine Karte mit variablen Generika?

Map<T, List<T>> map; 

Derzeit habe ich es zu erklären, mit „teilweise“ Generika:

Map<Object, List> map; 

Ich weiß, das ist schlecht, aber ich habe noch keine bessere Wahl . Ist es möglich, Generika in dieser Situation zu verwenden?

UPDATE

Vielleicht habe ich mein Problem nicht deutlich zum Ausdruck bringen. Ich möchte eine Karte, die in der Lage ist:

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

Und der folgende Code nicht kompilieren:

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

Der Schlüssel und der Wert sollte immer die gleiche generische Typ, während der generische Typ beliebig sein kann, und offensichtlich erweitert eine Karte meine Anforderung nicht.

+0

Raum sollte nicht das Problem sein. Es ist wahrscheinlich so, wie es benutzt wird. OP muss mehr Code zum Reparieren zeigen. – Nishant

+0

Verwenden Sie Schlüssel vom Typ "T" oder Schlüssel vom Typ "Schlüssel "? –

+0

Mit Ihrem tatsächlichen Szenario sollten Sie Kapselung verwenden, um Ihr Problem zu lösen, wie Nishant und Geoff in ihren Antworten angeben, passen Sie es einfach an Ihren tatsächlichen Code an. –

Antwort

7

Mir ist keine vorhandene Bibliothek bekannt, die genau dies tut, aber es ist nicht zu schwierig, sich selbst zu implementieren. Ich habe in der Vergangenheit schon ein paar Mal etwas Ähnliches gemacht. Sie können nicht die Standard-Map-Schnittstelle verwenden, aber Sie können eine Hash-Karte verwenden, um Ihre Klasse zu implementieren. Zu Beginn könnte es in etwa so aussehen:

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

Sie wickeln meine Karte Map > in eine andere Klasse.Scheint, dass eine einfache Karte meine Anforderung nicht erfüllen kann, also könnte dies die letzte Wahl sein. Vielen Dank! –

4

Dies ist, was Sie wollen:

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

Wenn Sie dann, was auch immer Klasse, die Sie wollen konkrete ändern sich nicht ein HashMap als Superklasse wollen.

+0

Bitte beachten Sie mein Update. –

+0

Ich habe meine Antwort geändert. – Brad

+0

Aber wie könnte ich nur eine "Test" -Instanz verwenden, um meine Daten zu speichern? –

Verwandte Themen