Declaração de Map<Class<T>, Collection<T> >

10 respostas
sergiotaborda

Alguém sabe como declarar um atributo do tipo Map<Class, Collection > ?

A ideia é vincular a classe com o conteudo do collection mas sem que a classe onde o atributo eiste seja generica.Mas o compilador acusa um “T not defined”

Tem como fazer isto ?

10 Respostas

R

Olá Sergio,

Não sei se entendi direito, mas basta fazerr assim que o compilador passa.

Map<Class<?>, Collection<?>>

Não sei se ajudei!

Abraço

Paulo_Silveira

ou esse T precisa ser explicitamente uma classe, ou voce precisa ter declarado o T como tipo parametrizado da sua classe, dona desse atributo:

class AlgumaClasse<T> {
  private Map<Class<T>, Collection<T>> map;
}
sergiotaborda

O problema é exatamente esse: não quero que a classe seja parameterizada. Isso não faz sentido.
Eu só quero manter uma coerência entre os atributos do mapa. O ? funciona mas não mantém a coerencia (é o mesmo que colocar Object).

Acho que não tem solução da forma que eu queria. Têm que usar ? e cast.

Marky.Vasconcelos

Assim

public <T> Map<Class<T>, Collection<T>> getMap(){
//...
}
sergiotaborda

Mark_Ameba:
Assim

public <T> Map<Class<T>, Collection<T>> getMap(){ //... }

Como eu disse… o objetivo é definir um atributo desse tipo. Ou seja, uma variável interna da classe.

peczenyj

Por exemplo, pelo seu exemplo vc gostaria de mapear uma classe a uma collection que possui objetos desta mesma classe, é isso?

Em um Map<K,V> vc tem método get que recebe um object, e um put que é parametrizado, ai vc teria algo mais restritivo, imagino eu, pois o K e o V tem uma relação intrinseca. Não vejo no mecanismo de generics vc conseguir criar esse vinculo sem fixar o parâmetro T.

sergiotaborda

peczenyj:
Por exemplo, pelo seu exemplo vc gostaria de mapear uma classe a uma collection que possui objetos desta mesma classe, é isso?

Em um Map<K,V> vc tem método get que recebe um object, e um put que é parametrizado, ai vc teria algo mais restritivo, imagino eu, pois o K e o V tem uma relação intrinseca. Não vejo no mecanismo de generics vc conseguir criar esse vinculo sem fixar o parâmetro T.

É. Realmente a solução é usar um mapa mais generico e um método que force a relação.

peczenyj

Vc não poderia criar o seu próprio Map com esta restrição?

sergiotaborda

Humm… não tinha pensado nisso. É que eu não queria criar uma classe só por isso (isso cai no negocio de criar uma classe generalizada), mas é uma boa ideia. Acho que com isso resolve da forma mais fortemente tipada.

A

Eu tenho uma classe java que tem um atributo:

-> private Collection grupos;

Eu quero mapear ele em uma classe .as como declararia uma variável para que eu possa usar ele no flex?

Obrigado

Criado 9 de março de 2008
Ultima resposta 31 de jan. de 2012
Respostas 10
Participantes 6