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.

Tiago Veloso
quelle

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

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

Einfach:

Integer i = 7;
Long l = new Long(i);
vahid kh
quelle
10
NPE wird ausgelöst , wenn die Integer null ist
Lux
2
Funktioniert für intWerte.
DARKPRINCE
11
Long.valueof sollte verwendet werden: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke
Dieser Code funktioniert (Java entpackt implizit das Integerto intund wandelt es dann um, longbevor es an den jetzt veralteten Long(long)Konstruktor übergeben wird.
Ole VV
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.

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

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

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

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

verlorene Übersetzung
quelle
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
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
quelle
2

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

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

oder

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

Dies ist nullsicher

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

Versuchen Sie, den Wert von Jackson zu konvertieren

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