Pergunta

Eu quero fazer um mapa de contêiner com a seguinte interface:

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

O ponto interessante é que o Ts em cada um Class<T> -> Thing<T> par é o mesmo T, mas o contêiner deve ser capaz de manter muitos tipos diferentes de pares. Inicialmente eu tentei um (hash)Mapa. Mas, por exemplo,

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

não está certo, porque então T seria o mesmo T por tudo pares nesse mapa. É claro,

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

funciona, mas então não tenho garantias de segurança do tipo para que quando eu get(String.class), Não posso ter certeza de que recebo um Thing<String> instância de volta.

Existe uma maneira óbvia de realizar o tipo de segurança que estou procurando?

Foi útil?

Solução

O mapa em si não garantiria que, mas se você o estiver acessando apenas pelos métodos acima, terá a segurança desejada.

Outras dicas

Se você deseja poder colocar diferentes tipos, não deve declarar dois parâmetros de tipo?

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

Ou eu entendi mal a pergunta?

EDIT: Entendo, bem, se você quiser um contêiner que possa conter entidades de tipos diferentes, não há como você ter um tipo de segurança completo, pois quando você declarar seu contêiner, você só pode colocar um tipo no contêiner e, em seguida, poderá ser capaz Para colocar objetos, mas você não pode ter certeza do que recebe de volta. Na melhor das hipóteses, você acabará colocando objetos como objeto e, em seguida, fazendo a instância e os lançamentos quando os recuperar. Todas as coleções têm esse problema. Imagine que você tem um Collection<T extends Thing>. Você pode colocar coisas, crianças ou netos, mas quando você o recupera, apenas garante é que é uma coisa, você não pode dizer se é uma criança ou neto, sem realmente testá -lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top