insertar - guardar objetos en un arraylist java
Java: muchas formas de lanzar un Objeto(largo) para duplicar (5)
Tengo un
Object objque 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 :
-
objes unNumbery 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.