Erro java.lang.ClassCastException

Senhores,

Estou com um problema durante a execução da classe java.

o erro a seguir:

[b]
17:03:56,593 ERROR [LogInterceptor] RuntimeException:
java.lang.ClassCastException
at com.ra.beans.MetricasConDataBean.getMetricaDataCon(MetricasConDataBean.java:215)

17:03:56,593 INFO [STDOUT] RuntimeException; nested exception is:
java.lang.ClassCastException
[/b]

O erro ocorre nessa linha do codigo:

tempVo.setPeriodo((String)entry.getKey());

Alguém sabe dizer o que quer dizer esse erro e como resolve-lo?

Obrigado,

Fabiano

entry.getKey() não é uma String.

Esse erro quer dizer provavelmente que o objeto retornado por getKey() não é um objeto da classe String.

Esse objeto entry é o quê?

Segue uma parte do codigo:

			if (metricaMap.size() != 0){
				metricaRetorno = new MetricaVo[metricaMap.size()];
				Iterator it = metricaMap.entrySet().iterator();
				int x = 0;
				while (it.hasNext()){
					Entry entry = (Entry)it.next();
					MetricaVo tempVo = (MetricaVo)entry.getValue();
					if (tempVo == null){
						tempVo = new MetricaVo(metricaList[i]);
					}
					tempVo.setPeriodo((String)entry.getKey());
					metricaRetorno[x++] = tempVo;
				}
			}

metricaMap é um TreeMap.

Perguntas rápidas: Voce…
:arrow: Tá usando Java 1.5(Java 5) ou java 1.4?
:arrow: Sabe utilizar generics?

Java 1.4

Não sei utilizar generics.


Respondendo a pergunta sobre entry.getKey(), realmente não é uma String, é do tipo Date, mas eu estou fazendo isso para que “vire” uma String, vamos assim dizer…

Vamos assim dizer que isso não dá pra fazer. Vc só pode forçar conversão entre tipos compatíveis hereditariamente. Como não há nenhuma relação de herança entre Date e String, vc tem um ClassCastException, pois vc tentou fazer um cast(conversão) de um objeto de uma classe (Date) para uma classe incompatível (String).
Esse Map seu: Vamos supor que nas chaves vc use objetos Date, e nos valores, objetos Object mesmo.
Pra vc pegar “um String do Date” e passar pro teu método, o ideal é vc fazer isso aqui:

tempVo.setPeriodo(entry.getKey().toString());

Você vai estar invocando o método toString() da classe do objeto retornado por getKey(). Como o seu objeto que tá ali dentro é da classe Date, vai ser invocado o toString() da classe Date.
Vai sair uma data num formato meio estranho, mas vc pode formatar da seguinte forma:

SimpleDateFormat formater = new SimpleDateFormat(
	"dd'/'MM'/'yyyy",
	new Locale("PT", "BR")
);
tempVo.setPeriodo(
	formater.format(
		(Date)entry.getKey()
	)
);

Espero ter ajudado!

Você pode utilizar o metodo toString de object. ai você não precisa fazer um cast. Outra opção legal é o DateFormat do pacote java.text junto com o operador instanceof. da uma olhada no exemplo:

java.text.DateFormat df = java.text.DateFormat.getDateTimeInstance();
/* pode ser tambem: 
 * java.text.DateFormat df = java.text.DateFormat.getDateInstance();
 * java.text.DateFormat df = java.text.DateFormat.getTimeInstance();
 * se quiser uma string data mais personalizada e legal dar uma estudada
 * na classe DateFormat tem bastante coisa na net.
*/
if (metricaMap.size() != 0){
		metricaRetorno = new MetricaVo[metricaMap.size()];
		Iterator it = metricaMap.entrySet().iterator();
		int x = 0;
		while (it.hasNext()){
			Entry entry = (Entry)it.next();
			MetricaVo tempVo = (MetricaVo)entry.getValue();
			if (tempVo == null){
				tempVo = new MetricaVo(metricaList[i]);
			}
			// se o seu problema e so com data isso deve resolver
			if(entry.getValue() instanceof Date){
				temVo.setPeriodo(df.format((Date)entry.getValue()));
			}
			tempVo.setPeriodo((String)entry.getKey());
			metricaRetorno[x++] = tempVo;
		}
	}

Espero que isso te ajude.

PessoALL,

funcionou com o toString() que o Mantu mencionou

Obrigado,

Fabiano.