Je veux faire une carte-type de conteneur qui a l'interface suivante:cartographie typées de la classe <T> Thing <T>
public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);
Le point intéressant est que les T
s dans chaque Class<T>
->Thing<T>
La paire est la même T
, mais le conteneur doit pouvoir contenir plusieurs types de paires différents. Initialement, j'ai essayé un (Hash) Map. Mais, par exemple,
Map<Class<T>, Thing<T>>
est pas juste, car alors T
serait le même T
pour toutes paires dans cette carte. Bien sûr,
Map<Class<?>, Thing<?>>
fonctionne, mais je ne disposent pas de garanties de type sécurité de telle sorte que quand je get(String.class)
, je ne peux pas être sûr que je reçois une instance Thing<String>
arrière.
Existe-t-il un moyen évident de réaliser le type de sécurité que je recherche?
J'ai essayé cela (un interne 'Map, Thing >>', la méthode put fonctionne bien, mais la méthode ne compile pas, elle dit "incompatibles types, trouvé: Thing ; " –
Cela dit, l'ajout d'un cast' (Thing) 'l'a corrigé Bien que ce soit en principe un cast non contrôlé, vous avez raison de dire qu'il réussira toujours si j'accède à la carte uniquement via les méthodes sécurisées. –
@Joonas: C'est comme ça que vous faites des astuces de type avancé, faites quelque chose que le compilateur pense être un peu dangereux et qui est en fait OK parce que vous faites les garanties de sécurité à un niveau plus élevé. ")' pour empêcher le compilateur de gémir à ce sujet –