Question

Je veux faire une carte-type de conteneur qui a l'interface suivante:

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 Ts dans chaque Class<T> -> paire de Thing<T> est le même T, mais le conteneur devrait être en mesure de tenir beaucoup de différents types de paires. Dans un premier temps j'ai essayé un (Hash) Carte . Mais, par exemple,

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

est pas juste, parce que T serait alors le même T pour tous paires dans cette carte. Bien sûr,

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

oeuvres, 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 de Thing<String> retour.

Y at-il une façon évidente d'accomplir le genre de sécurité de type que je suis à la recherche?

Était-ce utile?

La solution

La carte elle-même ne garantirait pas, mais si vous y accéder que par les méthodes ci-dessus, vous aurez la sécurité voulue.

Autres conseils

Si vous voulez être en mesure de mettre différents types ne devrait pas vous déclarer deux paramètres de type?

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

ou ai-je mal compris la question?

Edit: Je vois bien si vous voulez conteneur o qui peut contenir des entités de différents types, il n'y a aucun moyen que vous pouvez avoir complète la sécurité de type, puisque lorsque vous déclarez votre conteneur, vous ne pouvez mettre un type sur le récipient et vous peut être en mesure de mettre des objets, mais vous ne pouvez pas être sûr de ce que vous obtenez en retour. Au mieux, vous allez finir par mettre dans des objets comme objet, et puis en faisant instanceof et jette quand vous les obtenez en retour. Toutes les collections ont ce problème. Imaginez que vous avez un Collection<T extends Thing>. Vous pouvez mettre dedans, Les choses ChildOfThings ou GrandChildOfThings, mais quand vous le récupérerez, vous êtes seule garantie est que c'est une chose, vous ne pouvez pas dire si elle est un enfant ou petit, sans tester réellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top