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 realmentelong
.
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 unNumber
y no es unlong
. - 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.