Conversión de entero a largo


108

Necesito obtener el valor de un campo usando la reflexión. Sucede que no siempre estoy seguro de cuál es el tipo de datos del campo. Para eso, y para evitar cierta duplicación de código, he creado el siguiente método:

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}

Y usa este método como:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

o

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

El problema es que parece que no puedo enviar Integera Long:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

¿Existe una mejor manera de lograrlo?

Estoy usando Java 1.6.

Respuestas:


91

No, no puedes enviar Integera Long, aunque puedes convertir de inta long. Para un valor individual que se sabe que es un número y desea obtener el valor largo, puede usar:

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

Para las matrices, será más complicado ...


Para las matrices, puedo usar un Number[]y un bucle sobre él para crear una matriz debidamente escrita, ¿verdad?
Tiago Veloso

@Tiago: Depende de lo que esté devolviendo realmente el método . Eso no funcionaría para un double[]por ejemplo, pero podría trabajar para una Double[].
Jon Skeet

7
¿Por qué no puedes convertir de un entero a un largo?
MrMas

@MrMas: debido a que son tipos de referencia separados, ambas subclases directas de Number. O, para decirlo de otra manera: los que regla de conversión cree usted que no le permite convertir de uno a otro?
Jon Skeet

6
Okay. El problema es la herencia. Pienso en términos de precisión. Un número entero se puede convertir en un número entero largo sin perder información. Pero la estructura de herencia no tiene ninguna información que le diga eso al compilador.
MrMas


53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

Esto evita el impacto en el rendimiento de la conversión a String. El longValue()método en Integer es solo una conversión del valor int. El Long.valueOf()método le da a la máquina virtual la oportunidad de usar un valor en caché.


2
Para ser nulo guardar: Long l = i == null? null: i.longValue ()
Adrodoc55

19

Por extraño que parezca, descubrí que si analiza desde una cadena, funciona.

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

Ganar.


1
No tiene ningún sentido para mí, pero funciona de maravilla. ¡Muchas gracias!
Bouncner

33
Introducir una conversión de cadenas sin ningún motivo es una muy mala idea ... simplemente no hay ningún beneficio en hacer esto.
Jon Skeet

6
De acuerdo con @JonSkeet, mejor con esto: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher

1
Este método funciona bien pero es relativamente lento y usa más memoria que los otros métodos para hacer esto ...
krispy

1
se ve muy bien desde la perspectiva del desarrollador de front-end
Ezeewei

8

Conversión de entero a largo Muy simple y muchas formas de convertir ese
Ejemplo 1

 new Long(your_integer);

Ejemplo 2

Long.valueOf(your_integer); 

Ejemplo 3

Long a = 12345L;

Ejemplo 4
Si ya ha escrito el int como un entero, puede hacer esto:

Integer y = 12;
long x = y.longValue();

7

Convierta un número entero directamente en largo agregando 'L' al final de Integer.

Long i = 1234L;

5
¡Estoy seguro de que ha respondido sin leer toda la pregunta!
Diablo

3
@Diablo esta pregunta es el primer resultado al buscar "int to long" en Google, esta respuesta puede ser útil para otros
Dimitri W

1
@DimitriW No estoy diciendo que esta respuesta sea incorrecta, pero estoy diciendo que la respuesta a esta pregunta es incorrecta. Tienes razón, esto es útil para aquellas personas que no leen la pregunta y miran solo la respuesta.
Diablo

7

Si el entero no es nulo

Integer i;
Long long = Long.valueOf(i);

ise encasillará automáticamente en a long.

Usar en valueOflugar de newpermite el almacenamiento en caché de este valor (si es pequeño) por parte del compilador o JVM, lo que resulta en un código más rápido.


No puedo encontrar un método Long.valueOf (Integer i), los únicos que encuentro son valueOf (long l), valueOf (String s) y valueOf (String s, int radix). Comprobado para documentos Java8 y Java9.
Andy

1
El entero se convierte implícitamente en un tipo largo primitivo.
lostintranslation


2

Si sabe que Integer no es NULL, simplemente puede hacer esto:

Integer intVal = 1;
Long longVal = (long) (int) intVal


1

En intla longclase se incluye un analizador de variables al tipo Integer. Aquí hay un ejemplo:

int n=10;
long n_long=Integer.toUnsignedLong(n);

Puede usar fácilmente esta función incorporada para crear un método que analiza desde inthasta long:

    public static long toLong(int i){
    long l;
    if (i<0){
        l=-Integer.toUnsignedLong(Math.abs(i));
    }
    else{
        l=Integer.toUnsignedLong(i);
    }
    return l;
}

0

Esto es seguro para nulos

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();

0

Si no conoce la clase exacta de su número ( Integer , Long , Double , lo que sea), puede lanzar a Number y obtener su valor largo:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();

-1

En el caso de una Lista de tipo Long, agregando L al final de cada valor entero

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);

-1

Intenta convertirValue por Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

Votado en contra porque esta definitivamente no es la mejor respuesta: esta solución agrega complejidad innecesaria, sobrecarga de rendimiento y requiere una biblioteca adicional (Jackson)
NickGreen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.