Pregunta

Quiero hacer un mapa especie de contenedor que tiene la siguiente interfaz:

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

El punto interesante es que los Ts en cada Class<T> -> par Thing<T> es el mismo T, pero el envase debe ser capaz de mantener muchos tipos diferentes de pares. Al principio probé un (Hash) Mapa . Pero, por ejemplo,

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

no está bien, porque entonces T sería el mismo T para todos los pares en ese mapa. Por supuesto,

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

obras, pero luego no tengo garantías de seguridad de tipos para que cuando get(String.class), no puedo estar seguro de que tengo una espalda Thing<String> ejemplo.

¿Hay una manera obvia de lograr el tipo de seguridad de tipos que yo estoy buscando?

¿Fue útil?

Solución

El mapa en sí no garantizaría que, pero si usted está accediendo a ella sólo a través de los métodos anteriores, se tendrá la seguridad deseada.

Otros consejos

Si usted quiere ser capaz de poner diferentes tipos ¿no debería declarar dos parámetros de tipo?

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

o hizo que entienden mal la pregunta?

Edit: Ya veo, así que si quieres o contenedor que puede contener entidades de diferentes tipos, no hay manera que usted puede tener la seguridad de tipos completa, ya que cuando se declara su contenedor sólo se puede poner un tipo en el recipiente y entonces puede ser capaz de poner los objetos, pero no se puede estar seguro de lo que recibe. En el mejor de que va a terminar poniendo en objetos como objetos, y luego hacer instanceof y moldes cuando los vuelvas. Todas las colecciones tienen este problema. Imagine que tiene un Collection<T extends Thing>. Es posible poner en él cosas, ChildOfThings, o GrandChildOfThings, pero cuando te lo devuelve, eres única garantía es que es una cosa, no se puede decir si es un hijo o un nieto, sin tener que probarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top