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.

Tiago Veloso
fuente

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 ...

Jon Skeet
fuente
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
134

Simplemente:

Integer i = 7;
Long l = new Long(i);
vahid kh
fuente
10
NPE se lanza si el entero es nulo
lux
2
Trabaja por intvalores.
DARKPRINCE
11
Long.valueof debe usarse: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke
Este código funciona (Java desempaqueta implícitamente el Integerto inty luego lo convierte longantes de pasar al Long(long)constructor ahora obsoleto .
Ole VV
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é.

Rich MacDonald
fuente
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.

Luego
fuente
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();
Naresh Kumar
fuente
7

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

Long i = 1234L;
Jeff Johny
fuente
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.

perdido en la traducción
fuente
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
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
fuente
2

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

Integer intVal = 1;
Long longVal = (long) (int) intVal
Steven Spungin
fuente
1
new Long(Integer.longValue());

o

new Long(Integer.toString());
Pavlo Zvarych
fuente
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;
}
Bremsstrahlung
fuente
0

Esto es seguro para nulos

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();
Adkisson
fuente
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();
emperador
fuente
-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);
Joydeep Dutta
fuente
-1

Intenta convertirValue por Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)
lemonzone2010
fuente
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