Conversione da intero a lungo


108

Devo ottenere il valore di un campo usando la riflessione. Accade così che non sono sempre sicuro di quale sia il tipo di dati del campo. Per questo, e per evitare la duplicazione del codice, ho creato il seguente metodo:

@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 usa questo metodo come:

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

o

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

Il problema è che non riesco a trasmettere Integera Long:

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

C'è un modo migliore per raggiungere questo obiettivo?

Sto usando Java 1.6.

Risposte:


91

No, non puoi trasmettere Integera Long, anche se puoi convertire da inta long. Per un valore individuale noto per essere un numero e si desidera ottenere il valore lungo, è possibile utilizzare:

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

Per gli array, sarà più complicato ...


Per gli array posso usare un Number[]e un ciclo su di esso per creare un array digitato in modo appropriato, giusto?
Tiago Veloso

@Tiago: Dipende da cosa sta effettivamente restituendo il metodo . Che non avrebbe funzionato per un double[]per esempio, ma sarebbe lavorare per una Double[].
Jon Skeet

7
Perché non puoi lanciare da un numero intero a un lungo?
MrMas

@MrMas: poiché sono tipi di riferimento separati, entrambe le sottoclassi dirette di Number. O, per dirla in altro modo: quale regola di conversione credi non consentono di convertire da uno all'altro?
Jon Skeet

6
Ok. Il problema è l'eredità. Penso in termini di precisione. Un numero intero può essere convertito in un intero lungo senza perdere informazioni. Ma la struttura dell'ereditarietà non ha alcuna informazione che possa dirlo al compilatore.
MrMas


53
Integer i = 5; //example

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

Ciò evita il calo delle prestazioni della conversione in una stringa. Il longValue()metodo in Integer è solo un cast del valore int. Il Long.valueOf()metodo offre alla VM la possibilità di utilizzare un valore memorizzato nella cache.


2
Per essere nullo salva: Long l = i == null? null: i.longValue ()
Adrodoc55

19

Stranamente ho scoperto che se analizzi da una stringa funziona.

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

Vincere.


1
Non ha assolutamente senso per me, ma funziona come un fascino. Molte grazie!
Bouncner

33
Introdurre una conversione di stringhe senza motivo è una pessima idea ... semplicemente non c'è alcun vantaggio nel farlo.
Jon Skeet

6
D'accordo con @JonSkeet, meglio così: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher

1
Questo metodo funziona bene ma è relativamente lento e utilizza più memoria rispetto agli altri metodi per farlo ...
krispy

1
sembra fantastico dal punto di vista dello sviluppatore front-end
Ezeewei

8

Conversione di numeri interi in lunghi Molto semplice e molti modi per convertire
quell'Esempio 1

 new Long(your_integer);

Esempio 2

Long.valueOf(your_integer); 

Esempio 3

Long a = 12345L;

Esempio 4
Se hai già int digitato come Integer puoi farlo:

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

7

Converti un intero direttamente in long aggiungendo "L" alla fine di Integer.

Long i = 1234L;

5
Sono sicuro che hai risposto senza leggere l'intera domanda!
Diablo

3
@Diablo questa domanda è il primo risultato quando si cerca "int to long" su Google, questa risposta potrebbe essere utile ad altri
Dimitri W

1
@DimitriW Non sto dicendo che questa risposta è sbagliata, ma sto dicendo che la risposta a questa domanda è sbagliata. Hai ragione, questo è utile per quelle persone che non leggono la domanda e guardano solo la risposta.
Diablo

7

Se il numero intero non è nullo

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

iverrà automaticamente convertito in un file long.

L'utilizzo valueOfinvece di newconsente la memorizzazione nella cache di questo valore (se piccolo) da parte del compilatore o della JVM, risultando in un codice più veloce.


Non riesco a trovare un metodo Long.valueOf (Integer i), gli unici che trovo sono valueOf (long l), valueOf (String s) e valueOf (String s, int radix). Controllato per i documenti Java8 e Java9.
Andy

1
L'intero viene convertito implicitamente in un tipo lungo primitivo.
Lostintranslation


2

Se sai che l'Integer non è NULL, puoi semplicemente fare questo:

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


1

Nella classe è incluso un parser dalle intvariabili al longtipo Integer. Ecco un esempio:

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

Puoi facilmente utilizzare questa funzione incorporata per creare un metodo che analizza da inta 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

Questo è null-safe

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

0

Se non conosci la classe esatta del tuo numero ( Integer , Long , Double , qualunque), puoi lanciare a Number e ottenere il tuo valore lungo da esso:

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

-1

In caso di un elenco di tipo lungo, aggiungere L alla fine di ogni valore intero

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

-1

Prova a convertValue di Jackson

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

Downvoted perché questa non è sicuramente la risposta migliore: questa soluzione aggiunge complessità inutili, overhead delle prestazioni e richiede una libreria extra (Jackson)
NickGreen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.