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.

Tiago Veloso
fonte

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

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

Simplesmente:

Integer i = 7;
Long l = new Long(i);
vahid kh
fonte
10
NPE é lançado se o inteiro for nulo
lux
2
Trabalha por intvalores.
dARKpRINCE
11
Long.valueof deve ser usado: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke
Este código funciona (Java descompacta implicitamente o Integerpara inte depois converte para longantes de passar para o Long(long)construtor obsoleto .
Ole VV
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.

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

Anon
fonte
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();
Naresh Kumar
fonte
7

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

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

perdido na tradução
fonte
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
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
fonte
2

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

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

ou

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

Isto é seguro para nulos

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

Tente converterValue de Jackson

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