Convertendo Inteiro em Longo


108

Preciso obter o valor de um campo usando reflexão. Acontece que nem sempre tenho certeza de qual é o tipo de dados do campo. Para isso, e para evitar alguma duplicação de código, criei o seguinte 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;
}

E use este método como:

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

ou

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

O problema é que não consigo lançar Integerpara Long:

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

Existe uma maneira melhor de conseguir isso?

Estou usando o Java 1.6.

Respostas:


91

Não, você não pode transmitir Integerpara Long, embora possa converter de intpara long. Para um valor individual que é conhecido por ser um número e você deseja obter o valor longo, você pode usar:

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

Para matrizes, será mais complicado ...


Para arrays, posso usar um Number[]e um loop sobre ele para criar uma matriz digitada de maneira apropriada, certo?
Tiago Veloso

@Tiago: Depende do que o método está realmente retornando. Isso não funcionaria para um double[], por exemplo, mas iria trabalhar para um Double[].
Jon Skeet

7
Por que você não pode lançar de um inteiro para um longo?
MrMas

@MrMas: Por serem tipos de referência separados, ambos direcionam subclasses de Number. Ou, dito de outra forma: qual regra de conversão você acredita que permite a conversão de uma para a outra?
Jon Skeet

6
Está bem. O problema é a herança. Estou pensando em termos de precisão. Um inteiro pode ser convertido em um inteiro longo sem perder informações. Mas a estrutura de herança não tem nenhuma informação que diga isso ao compilador.
MrMas


53
Integer i = 5; //example

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

Isso evita o impacto no desempenho da conversão para uma String. O longValue()método em Integer é apenas uma conversão do valor int. O Long.valueOf()método dá ao vm a chance de usar um valor armazenado em cache.


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

19

Estranhamente, descobri que, se você analisar a partir de uma string, funciona.

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

Ganhar.


1
Não faz absolutamente nenhum sentido para mim, mas funciona como um encanto. Muito obrigado!
Bouncner

33
Introduzir uma conversão de string sem motivo é uma ideia realmente ruim ... simplesmente não há benefício em fazer isso.
Jon Skeet

6
Concordo com @JonSkeet, é melhor: Objeto i = 10; Long l = ((Número) i) .longValue ();
depsypher

1
Este método funciona bem, mas é relativamente lento e usa mais memória do que os outros métodos de fazer isso ...
krispy

1
parece ótimo do ponto de vista do desenvolvedor de front-end
Ezeewei

8

Convertendo Inteiro em Longo Muito Simples e muitas maneiras de converter esse
Exemplo 1

 new Long(your_integer);

Exemplo 2

Long.valueOf(your_integer); 

Exemplo 3

Long a = 12345L;

Exemplo 4
Se você já tem o int digitado como um inteiro, você pode fazer o seguinte:

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

7

Converta um inteiro diretamente em longo adicionando 'L' ao final do inteiro.

Long i = 1234L;

5
Tenho certeza que você respondeu sem ler a pergunta inteira!
Diablo

3
@Diablo esta pergunta é o primeiro resultado da pesquisa "int to long" no Google, esta resposta pode ser útil para outras pessoas
Dimitri W

1
@ DimitriW Não estou dizendo que esta resposta está errada, mas estou dizendo que a resposta para esta pergunta está errada. Você tem razão, isso é útil para aquelas pessoas que não lêem a pergunta e olham apenas para a resposta.
Diablo,

7

Se o inteiro não for nulo

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

iserá automaticamente convertido em a long.

Usar em valueOfvez de newpermite o armazenamento em cache desse valor (se for pequeno) pelo compilador ou JVM, resultando em um código mais rápido.


Não consigo encontrar um método Long.valueOf (Integer i), os únicos que encontro são valueOf (long l), valueOf (String s) e valueOf (String s, int radix). Verificado para documentos Java8 e Java9.
Andy

1
O número inteiro é convertido implicitamente em um tipo longo primitivo.
perdeu a tradução em


2

Se você sabe que o Integer não é NULL, você pode simplesmente fazer isso:

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


1

Um analisador de intvariáveis ​​para o longtipo está incluído na Integerclasse. Aqui está um exemplo:

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

Você pode usar facilmente essa função embutida para criar um método que analisa de intpara 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

Isto é seguro para nulos

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

0

Se você não souber a classe exata do seu número ( Inteiro , Longo , Duplo , qualquer que seja), você pode lançar para Número e obter seu valor longo a partir dele:

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

-1

No caso de uma lista do tipo longa, adicionando L ao final de cada valor inteiro

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

-1

Tente converterValue de Jackson

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

Votos negados porque esta definitivamente não é a melhor resposta: esta solução adiciona complexidade desnecessária, sobrecarga de desempenho e requer uma biblioteca extra (Jackson)
NickGreen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.