Frage

Ich möchte eine Karte-Art von Behälter machen, die die folgende Schnittstelle:

public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);

Der interessante Punkt ist, dass die Ts in jedem Class<T> -> Thing<T> Paar die gleiche T ist, aber der Behälter soll viele der Lage sein, verschiedene Arten von Paaren zu halten. Am Anfang habe ich versucht, einen (Hash) Karte . Aber zum Beispiel

Map<Class<T>, Thing<T>>

ist nicht richtig, denn dann T die gleichen T wäre für alle Paare in dieser Karte. Natürlich

Map<Class<?>, Thing<?>>

funktioniert, aber dann Typsicherheit garantiert ich nicht so haben, dass, wenn ich get(String.class), kann ich nicht sicher sein, dass ich eine Thing<String> Instanz zurück.

Gibt es eine offensichtliche Möglichkeit, die Art der Typsicherheit zu erreichen, dass ich suche?

War es hilfreich?

Lösung

Die Karte selbst würde das nicht garantieren, aber wenn man es nur durch die oben genannten Methoden zugreifen, werden Sie die gewünschte Sicherheit haben.

Andere Tipps

Wenn Sie in der Lage sein wollen, verschiedene Arten setzen sollten Sie nicht zwei Typparameter deklarieren?

public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);

oder habe ich falsch verstehen die Frage?

Edit: Ich sehe, auch wenn Sie o Container möchten, die Einheiten verschiedener Typen aufnehmen können, gibt es keine Möglichkeit, komplette Typsicherheit haben kann, da, wenn Sie Ihren Behälter erklären können Sie nur auf dem Behälter eine Art setzen und Sie dann kann in der Lage sein, Objekte zu setzen, aber Sie können nicht sicher sein, was Sie wieder zu bekommen. Allenfalls werden Sie am Putting in Objekten als Objekt beenden, und dann instanceof und Abgüsse tun, wenn Sie sie zurück. Alle Kollektionen haben dieses Problem. Stellen Sie sich eine Collection<T extends Thing> haben. Sie können in ihm Dinge, ChildOfThings setzen, oder GrandChildOfThings, aber wenn Sie es zurück, du bist nur Garantie ist, dass es eine Sache ist, kann man nicht sagen, ob es ein Kind oder Enkel ist, ohne es wirklich zu testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top