Casting

Tenho um map com vários objetos. Este tem como chave uma string que representa o nome de um atributo de uma classe.

Ao especificar um atributo vou recuperar o objeto que esta no map. Até ai legal.

Tenho uma tela de pesquisa que ao ser instanciada, são passados os atributos válidos para pesquisa. Esta terá um jtextfield que retornará o valor a pesquisar.

Agora tenho que jogar esse atributo num object fazendo casting para o tipo original dele.

Para saber o tipo, sendo que tenho o nome do atributo, uso reflection para obter o Class do tipo:

Class tipo = field.getType();

Quando tento fazer

Object obj = (tipo)map.get("atributo");

recebo uma menssagem de erro. Na verdade ele não está aceitando fazer casting porque o map retorna um Object.

Não teria problema algum se a pesquisa sempre fosse realizada em campos String.

Mas, caso for pesquisar por código por exemplo vai retornar uma String e não um Integer.

Preciso do tipo original declarado no atributo da classe porque estou usando hibernate e este não aceita uma string ou outro tipo.

Alguém tem alguma idéia ou sugestão para construir esta tela de pesquisa de forma genérica?

Nunca tentei fazer casting dinamico … O q eu costumo fazer eh usar o o instanceof

Fica mais ou menos assim:

Object conf = map.get("atributo"); if(conf instanceof String){ return (String)conf; }else{ if(cont instanceof Integer){ return (Integer)conf; }else{ return null; } }

Nao sei c essa eh a melhor forma de implementar, mas resolve

:smiley:

aborges,
Pensei nisso mas se tiver 30 classes. Imagina como iria ficar o código e sem falar no trabalho que ia dar.

Fabricio, nao entendi uma coisa… pra que vc quer fazer cast pra um objeto se vc nao sabe o tipo dele em tempo de compilacao? O que voce vai fazer com o objeto, depois que tiver feito o cast?

[quote=“fabriciogiordani”]aborges,
Pensei nisso mas se tiver 30 classes. Imagina como iria ficar o código e sem falar no trabalho que ia dar.[/quote]

E este 30 objetos não possuem nem uma interface comum? :shock: Tem alguma coisa errada.

Andei dando uma procurada na net, e li q eh impossível fazer um casting dinamico, pq ele eh validado em tempo de compilacao ( ou seja, soh serve pra vc falar pro seu compilador q os objetos sao de tipos difentes, mas vc agarante q um pode receber o outro )…

O compilador confia em vc, mas c durante a execucao der algum problema ele te retorna um ClassCastException

Alem disso, dah uma pensada no q o Daniel Quirino postou … Qd vc disse 30 classes vc estava apenas exemplificando ou eh seu caso?

:arrow: Explicarei:

Tela de consulta.
Tenho uma JInternalFrame que possui um combo com os atributos que o usuário vai escolher para pesquisar.
Tenho também um JTextField onde ele vai digitar o valor de sua pesquisa.
Tenho ainda uma table onde serão exibidos os dados dos objetos retornados pela pesquisa no hibernate (uma List).

Pensei em fazer o seguinte:
Exemplo:
O cara escolhe no combo nome e digita no JTextField o nome ou parte (“Mari”).
Pego o atributo “nome” e o valor “Mari” e jogo no map
map.put(“nome”, “Mari”).
Mas querendo refinar um pouco mais a pesquisa o cara escolhe rua e digita(“Sete de se”).
Pego o atributo “endereco” e o valor “Sete de se” e jogo no map
map.put(“endereco”, “Sete de se”).

Dessa forma terei no map 2 objetos String.

Quero disponibilizar também a pesquisa por código:
O cara escolhe no combo codigo e digita no JTextField o codigo “5”.
Pego o atributo “codigo” e o valor “5” e jogo no map
map.put(“codigo”, “5”).

Quando recebo o map e vou montar a Criteria do hibernate não sei qual tipo de valor tenho no map.

Como a criteria recebe atributo e objeto referente ao atributo sou obrigado a fazer o casting.

Foi assim que eu entrei na fria acima :frowning: .

Alguém tem alguma sugestão de alguma forma diferente pra fazer isso.

É que eu queria uma tela que service para qualquer consulta. Eu passo os valores do combo e depois monto a Table de acordo com o resultado (List).

:arrow: Pra cada VO (Ex.: Cliente, Cidade, Estado) eu teria uma projeção de tela diferente. Por isso que eu falei uns 30. De que forma poderia definir interfaces pra eles.

Pergunta besta: você não tenta converter um tipo primitivo em classe não né?

Porque se tiver um int ai no meio a coisa toda fica feia :smiley:

A principio não, mas acho que a possibilidade mais a frente de precisar de algo parecido. Mas daí é mais fácil verificar se é primitivo do que se é objeto já que temos os primitivos definidos e em número pequeno.