Gibt es in Java eine Map, in der der Typparameter eines Werts an den Typparameter eines Schlüssels gebunden ist? Was ich will, schreiben, so etwas wie die folgende ist:Java-Map mit Werten, die durch den Schlüsseltyp-Parameter begrenzt sind
public class Foo {
// This declaration won't compile - what should it be?
private static Map<Class<T>, T> defaultValues;
// These two methods are just fine
public static <T> void setDefaultValue(Class<T> clazz, T value) {
defaultValues.put(clazz, value);
}
public static <T> T getDefaultValue(Class<T> clazz) {
return defaultValues.get(clazz);
}
}
Das heißt, ich kann speichern alle Standardwert mit einem Class-Objekt, sofern Art der Wert der dem des Klassenobjekt. Ich sehe nicht, warum dies nicht erlaubt sein sollte, da ich sicherstellen kann, wenn Werte eingestellt/erhalten werden, dass die Typen korrekt sind.
EDIT: Danke an Cletus für seine Antwort. Ich brauche eigentlich nicht die Typparameter auf der Karte selbst, da ich Konsistenz in den Methoden sicherstellen kann, die Werte erhalten/setzen, auch wenn es bedeutet, einige leicht hässliche Umwandlungen zu verwenden.
Was ist, wenn der Wert selbst generisch ist? Zum Beispiel, anstatt 'String's und' int's zu speichern, müssen Sie 'PrettyPrinter' speichern, wobei 'T' das Typ-Token ist, das als Schlüssel in der Karte verwendet wird? –
Lucas
@Lucas Guava stellt zu diesem Zweck ['TypeToInstanceMap'] bereit (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/reflect/TypeToInstanceMap.html); zusammen mit ["ClassToInstanceMap"] (https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap), das Blochs 'Favorites'-API repliziert. – dimo414