2012-07-02 21 views
6

Estoy accediendo a una instancia de MongoDB desde Java que está escrita en una aplicación de Rails. Estoy recuperando valores enteros que deben almacenarse en Long, porque pueden exceder los 32 bits.Error de conversión de tipo largo al leer el campo entero desde MongoDB en Java

Este código se compilará:

this.profile_uid = (Long)this.profile.get("uid"); 

Sin embargo, yo estoy haciendo una conversión de tipos de error en tiempo de ejecución:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 

Esto es probablemente porque el campo es devuelto por Mongo como entero, pero sé que algunas ID's pueden venir como Longs y por diversas razones no puedo cambiar el tipo escrito en la base de datos (desde otra aplicación); puede ser de 32 bits en algunos casos y de 64 bits en otros.

La aplicación Java necesita manejar cualquiera de los dos, y no quiero tropezar con algún tipo de problema de truncamiento o desbordamiento. Quiero leerlo como Long en el lado de Java.

He intentado la solución a continuación y parece funcionar, pero no sé si estoy a salvo de problemas de truncamiento o desbordamiento de esta manera. No estoy seguro de qué es lo que hace la clase Number en Java.

this.profile_uid = ((Number)this.profile.get("uid")).longValue(); 

¿Esto es legítimo? ¿Qué efectos secundarios tiene? ¿Hay otra/mejor manera?

+1

puede verificar el tipo de valor devuelto usando ** instaceof ** y luego tomar la decisión correspondiente para la conversión tipo –

Respuesta

5

La solución sugerida es legítima. Number es la superclase de todas las clases de números en Java. Suponiendo que su campo "uid" está en formato numérico, this.profile.get("uid")) devolverá un objeto que es una subclase de Number (y de ahí que el molde a Number siempre funcionará).

Todas las subclases de hormigón de Number deben implementar el método longValue(), ya que se define como un método abstracto en la clase Number.

Integer.longValue() convierte su valor interno int a largo. Long.longValue() simplemente devuelve su valor interno largo.

+0

Muchas gracias. Eso es exactamente lo que necesitaba saber. –

Cuestiones relacionadas