Ganzzahl in Long konvertieren


108

Ich muss den Wert eines Feldes durch Reflexion ermitteln. Es kommt also vor, dass ich nicht immer sicher bin, welchen Datentyp das Feld hat. Zu diesem Zweck und um eine Vervielfältigung des Codes zu vermeiden, habe ich die folgende Methode erstellt:

@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;
}

Und verwenden Sie diese Methode wie folgt:

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

oder

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

Das Problem ist , dass ich nicht zu Guss scheinen kann Integerzu Long:

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

Gibt es einen besseren Weg, um dies zu erreichen?

Ich benutze Java 1.6.

Antworten:


90

Nein, Sie können nicht Integerin Longumwandeln, obwohl Sie von intnach konvertieren können long. Für eine Person Wert, von dem bekannt ist, dass er eine Zahl ist und Sie den langen Wert erhalten möchten, können Sie Folgendes verwenden:

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

Für Arrays wird es schwieriger ...


Für Arrays kann ich ein Number[]und eine Schleife darüber verwenden, um ein entsprechend typisiertes Array zu erstellen, oder?
Tiago Veloso

@Tiago: Es hängt davon ab, was die Methode tatsächlich zurückgibt . Das wäre nicht für eine Arbeit double[]zum Beispiel, aber würde für eine Arbeit Double[].
Jon Skeet

7
Warum kannst du nicht von einer ganzen Zahl in eine lange umwandeln?
MrMas

@ MrMas: Da es sich um separate Referenztypen handelt, sind beide direkte Unterklassen von Number. Oder anders ausgedrückt: die Konvertierungsregel glauben Sie nicht lassen Sie sich von einem zum anderen zu konvertieren?
Jon Skeet

6
OK. Das Problem ist die Vererbung. Ich denke in Präzision. Eine Ganzzahl kann in eine lange Ganzzahl konvertiert werden, ohne dass Informationen verloren gehen. Die Vererbungsstruktur enthält jedoch keine Informationen, die dem Compiler dies mitteilen würden.
MrMas


53
Integer i = 5; //example

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

Dies vermeidet den Leistungseinbruch beim Konvertieren in einen String. Die longValue()Methode in Integer ist nur eine Umwandlung des int-Werts. Die Long.valueOf()Methode gibt dem VM die Möglichkeit, einen zwischengespeicherten Wert zu verwenden.


2
Um null zu speichern: Long l = i == null? null: i.longValue ()
Adrodoc55

19

Seltsamerweise habe ich festgestellt, dass es funktioniert, wenn Sie aus einer Zeichenfolge analysieren.

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

Sieg.


1
Es macht absolut keinen Sinn für mich, aber es funktioniert wie ein Zauber. Vielen Dank!
Bouncner

33
Die Einführung einer String-Konvertierung ohne Grund ist eine wirklich schlechte Idee. Dies hat einfach keinen Vorteil.
Jon Skeet

6
Stimmen Sie mit @JonSkeet überein, besser dran: Objekt i = 10; Langes l = ((Zahl) i) .longValue ();
Depsypher

1
Diese Methode funktioniert gut, ist aber relativ langsam und
verbraucht

1
sieht aus der Sicht eines Front-End-Entwicklers großartig aus
Ezeewei,

8

Konvertieren von Integer in Long Very Simple und viele Möglichkeiten zum Konvertieren dieses
Beispiels 1

 new Long(your_integer);

Beispiel 2

Long.valueOf(your_integer); 

Beispiel 3

Long a = 12345L;

Beispiel 4
Wenn Sie das int bereits als Ganzzahl eingegeben haben, können Sie dies tun:

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

7

Konvertieren Sie eine Ganzzahl direkt in Long, indem Sie am Ende von Integer 'L' hinzufügen.

Long i = 1234L;

5
Ich bin sicher, Sie haben geantwortet, ohne die gesamte Frage zu lesen!
Diablo

3
@ Diablo diese Frage ist das erste Ergebnis bei der Suche nach "int zu lang" bei Google, diese Antwort kann für andere nützlich sein
Dimitri W

1
@DimitriW Ich sage nicht, dass diese Antwort falsch ist, aber ich sage, dass die Antwort auf diese Frage falsch ist. Sie haben Recht. Dies ist nützlich für Personen, die die Frage nicht lesen und nur die Antwort betrachten.
Diablo

7

Wenn die Ganzzahl nicht null ist

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

i wird automatisch auf a typisiert long .

Die Verwendung von valueOfanstelle von newermöglicht das Zwischenspeichern dieses Werts (falls er klein ist) durch den Compiler oder die JVM, was zu einem schnelleren Code führt.


Ich kann keine Long.valueOf (Integer i) -Methode finden. Ich finde nur valueOf (long l), valueOf (String s) und valueOf (String s, int radix). Auf Java8- und Java9-Dokumente überprüft.
Andy

1
Ganzzahl wird implizit in einen primitiven langen Typ konvertiert.
Verlorene Übersetzung


2

Wenn Sie wissen, dass die Ganzzahl nicht NULL ist, können Sie dies einfach tun:

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


1

Ein Parser von intVariablen zum longTyp ist in der IntegerKlasse enthalten. Hier ist ein Beispiel:

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

Sie können diese in-built - Funktion verwenden , um ein Verfahren zu schaffen , das Parsen von intzu 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

Dies ist nullsicher

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

0

Wenn Sie die genaue Klasse Ihrer Zahl nicht kennen ( Integer , Long , Double , was auch immer), können Sie in Number umwandeln und Ihren Long-Wert daraus erhalten:

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

-1

Bei einer Liste vom Typ Long wird am Ende jedes Integer-Werts L hinzugefügt

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

-1

Versuchen Sie, den Wert von Jackson zu konvertieren

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

Downvoted, weil dies definitiv nicht die beste Antwort ist: Diese Lösung erhöht die Komplexität und den Leistungsaufwand unnötig und erfordert eine zusätzliche Bibliothek (Jackson)
NickGreen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.