objetos insertar guardar java casting numbers double long-integer

insertar - guardar objetos en un arraylist java



Java: muchas formas de lanzar un Objeto(largo) para duplicar (5)

Tengo un Object obj que sé que es realmente long .

No, tu no. long es un tipo de datos primitivo, y los tipos primitivos en Java no son objetos. Tenga en cuenta que hay una diferencia entre el tipo primitivo long y java.lang.Long , que es una clase contenedora.

No puede convertir un Long (objeto) en un long (primitivo). Para obtener el valor long de Long , llame a longValue() en él:

Long obj = ...; long value = obj.longValue();

¿Es seguro lanzarlo directamente al double ?

Si en realidad es un primitivo long , entonces sí, puedes convertirlo en un double . Si es un objeto Long , no necesita lanzar, simplemente puede llamar a doubleValue() en él:

double x = obj.doubleValue();

Tengo un Object obj que sé que es realmente long . En algún código matemático, lo necesito como el double .

¿Es seguro lanzarlo directamente al doble?

double x = (double)obj;

O debería preferir lanzar primero a largo y luego a doblar.

double x = (double)(long)obj;

También encontré otra alternativa (menos legible):

double x = new Long((long)obj).doubleValue();

¿Cuáles son los peligros / implicaciones de hacer algo?

Resumen de la solución :

  • obj es un Number y no es un long .
  • Java 6 requiere conversión explícita, por ejemplo: double x = ((Number)obj).doubleValue()
  • Java 7 tiene magia de lanzamiento de trabajo: double x = (long)obj

Para obtener más detalles sobre el problema de Java6 / 7, también lea la discusión de la respuesta de TJ .

Editar: Hice algunas pruebas rápidas. Ambas formas de transmisión (explícita / mágica) tienen el mismo rendimiento.


El moldeado simple debería funcionar perfectamente bien. Esto será más rápido que ir a través de las clases contenedoras, obtener representación de cadenas y luego analizar para duplicar, crear una instancia nueva nuevamente usando el valor largo, y lo que es más importante, es más legible.

double d = (double)15234451L;


Puedes lanzarlo a un Long (dado que el Object no es long sino Long ), y luego lanzar el Long a un double :

double d = (double)(Long)obj;

Por ejemplo, esto tiene el resultado esperado de 2.6666666666666665:

public class CastDouble { public static final void main(String[] args) { Object o = 15L; System.out.println(40 / (double)(Long)o); } }


Solo necesitas un elenco, desde Objeto hasta Largo o largo (que implícitamente lanza a Largo y luego aplica unboxing):

Object o = 5L; double d = (long) o; //Apparently only works on Java 7+ //or double d = (Long) o;


Como cada número primitivo en Java se convierte a su tipo de boxeo cuando se necesita un objeto (en nuestro caso Long ) y cada número encuadrado es una instancia de Number la forma más segura de hacerlo es:

final Object object = 0xdeadbeefL; final double d = ((Number)object).doubleValue();

El peligro aquí es, como siempre, que el Object que queremos lanzar no es del tipo Number en cuyo caso obtendrás una ClassCastException . Puede verificar el tipo de objeto como

if(object instanceof Number) ...

si desea evitar excepciones de lanzamiento de clase y, en su lugar, proporcionar un valor predeterminado como 0.0 . También los métodos que fallan silenciosamente no siempre son una buena idea.