Map<String,String> retornando long

3 respostas
L

Pessoal alguem ja viu isso?
Tenho um map<String, String> e quando uso map.get(“chave”) ele me retorna um Long.

No meu caso o valor é um número que busco no banco via HQL

3 Respostas

gomesrod

Veja este exemplo:

Map<String, String> map = new HashMap<String, String>();
putValue(map);
map.get("chave");  // Essa chamada retornará um Long

///...
void putValue(Map map) {
     map.put("chave", new Long(1));
}

Isso é possível devido a duas características do Generics:

  • Ele é uma “trava” que verifica no momento da compilação se os tipos corretos estão sendo usados. Durante a execução do programa o generics não existe, seu HashMap<String, String> vira simplesmente um HashMap.
  • É possível fazer conversões entre elementos parametrizados (Map<String, String> ) e não parametrizados (Map). Isso é necessário em algumas situações, por isso é permitido. Uma vez que você tem uma referência não-parametrizada, o compilador já não tem mais como fazer as validações de tipo.

Resumindo… é muito fácil de burlar a parametrização de tipos. É uma ferramenta que ajuda a evitar alguns erros, mas ao mesmo tempo é flexível suficiente para ser ignorada, depende de o desenvolvedor saber o que está fazendo.

Então, voltando ao seu caso, provavelmente o código que insere o valor no mapa não está respeitando a parametrização <String, String>. Terá que investigar melhor esse trecho, para entender por que está dessa forma e como resolver.

L

Obrigado Gomes pela resposta, resolvi o problema da seguinte maneira para evitar problemas em tempo de compilação e execução:

for (Map<String, String> mapa : lista) {
					Object o = mapa.get("numDemandas");
					Long numero = (Long) o;
					qtde = qtde + numero.intValue();
				}

Pois se eu pegasse como string ocorria erro de conversão de Long para String, se pegasse como Long dava problema de compilação, ai utilizei este workarround srrs

gomesrod

Vai funcionar, mas se eu fosse você tentaria ir mais a fundo no problema para compreender melhor o que está acontecendo.

Algumas perguntas que você poderia tentar resolver investigando o código:

Esse mapa deveria conter apenas valores String? Nesse caso o código que colocou um Long está errado, ele é que deveria ser corrigido.
ou pelo contrário,
O mapa deve justamente conter objetos de tipos variados, de acordo com o tipo dos valores no banco? Nesse caso o que está errado é armazenar em um Map<String, String>. Poderia estar em um Map<String, Object> , ou em um objeto customizado que encapsula o Map.

Mantendo desse jeito, você perde o benefício do Generics, pois a especificação de tipo não é confiável (“O Map é <String,String>, mas pode conter qualquer coisa”). Isso pode se tornar um pesadelo na manutenção do sistema e eventualmente causar alguns bugs malucos.

Criado 24 de junho de 2014
Ultima resposta 26 de jun. de 2014
Respostas 3
Participantes 2