Wie konvertiere ich in Java von int nach Long?


219

Ich finde sowohl hier als auch bei Google-Leuten immer wieder Probleme, von und longnach intund nicht umgekehrt. Ich bin mir jedoch sicher, dass ich nicht der einzige bin, der auf dieses Szenario gestoßen ist, bevor er von intzu übergegangen ist Long.

Die einzigen anderen Antworten, die ich gefunden habe, waren "Setze es zuerst als lang", was die Frage wirklich nicht anspricht.

Ich habe anfangs versucht zu gießen, aber ich bekomme ein " Cannot cast from int to Long"

for (int i = 0; i < myArrayList.size(); ++i ) {
    content = new Content();
    content.setDescription(myArrayList.get(i));
    content.setSequence((Long) i);
    session.save(content);
}

Wie Sie sich vorstellen können, bin ich ein wenig ratlos, intda einige Inhalte als ArrayListund eingehen und die Entität, für die ich diese Informationen speichere, die Sequenznummer als Long benötigt.


for (long i = 0; i <myList.size (); ++ i) funktioniert auch
Instantsoup

@Instantsoup Ja, das funktioniert für die Schleife, aber wie ich am Ende meiner Frage angegeben habe, erfordert die ArrayList, mit der ich arbeite, das primitive int, wenn angegeben wird, welche
Indexposition abgerufen werden soll

long longValue = intValue | 0L;
Daniel Jipa

Was ich getan habe ist: Guss intzu longzuerst, dann zuordnen longzu Long. zBint x = 2; Long y = (long)x;
Eric Wang

Antworten:


244

Beachten Sie, dass es einen Unterschied zwischen einem Cast to longund einem Cast to gibt Long. Wenn Sie in long(einen primitiven Wert) umwandeln, sollte dieser automatisch in einen Long(den Referenztyp, der ihn umschließt) eingeschlossen werden.

Alternativ können Sie neweine Instanz von erstellen Longund mit dem intWert initialisieren .


31
Um zu demonstrieren, was Earwicker gesagt hat, können Sie Long.valueOf (i) aufrufen. Dies dauert lange, erweitert jedoch ein int und gibt Ihnen ein Long-Objekt zurück.
Grundlefleck

1
Autoboxing ist vorzuziehen, da nicht Longjedes Mal ein neues Objekt erstellt werden muss.
Michael Myers

2
(Warnung: Der Rest dieses Kommentars besteht aus Vermutungen und Vermutungen.) Wenn die Werte für Long.valueOf () zwischen 0 und 128 liegen, was sehr häufig vorkommt und eine zwischengespeicherte Instanz zurückgibt, ist dies dem Autoboxing vorzuziehen? (Ich kann eine neue Frage stellen, wenn Sie denken, dass es sich lohnt ...)
Grundlefleck

4
Autoboxing macht das Gleiche. Übrigens ist es zwischen -127 und 128.
Daniel Earwicker

6
@Grundlefleck: Autoboxing verwendet Long.valueOf()(wenn ich mich richtig erinnere), also würde es überhaupt keinen Unterschied geben. Mein Kommentar war eine Antwort auf die Antwort, nicht auf Ihren Kommentar.
Michael Myers

193

Verwenden Sie Folgendes : Long.valueOf(int);.


5
Achten Sie darauf, dass dadurch eine NullPointerException generiert wird, wenn Sie ein Integer-Objekt empfangen, das null ist.
Will824

2
Richtig, wenn ich falsch bin. Ich dachte, die Antwort ist alt, weil ich die Methode nicht finden kannLong.valueOf(int) !!
shareef

5
@ will824 - Eine primitive 'int'-Variable kann nicht null sein.
Rondo

1
@shareef - siehe Sergs Kommentar - aber ich denke, diese Methode wandelt das Int in ein Long um, das Autoboxen mit einem Long ... also überflüssig erscheint
Rondo

1
@Rondo eine IntegerDose, was er gesagt hat.
Moira

17

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

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


6

Ich habe dieses kleine Spielzeug, das sich auch mit nicht generischen Schnittstellen befasst. Ich bin damit einverstanden, eine ClassCastException auszulösen, wenn der Feed falsch ist (OK und glücklich).

public class TypeUtil {
    public static long castToLong(Object o) {
        Number n = (Number) o;
        return n.longValue();
    }
}

6

In Java können Sie Folgendes tun:

 int myInt=4;
 Long myLong= new Long(myInt);

in Ihrem Fall wäre es:

content.setSequence(new Long(i));

6

Wie wäre es mit

int myInt = 88;

// Wird nicht kompiliert

Long myLong = myInt;

// Kompiliert und behält den Nicht-NULL-Geist von int bei. Die beste Besetzung ist überhaupt keine Besetzung . Natürlich kann Ihr Anwendungsfall lange und mögliche NULL-Werte erfordern. Aber wenn das int oder andere Longs Ihre einzige Eingabe sind und Ihre Methode geändert werden kann, würde ich diesen Ansatz vorschlagen.

long myLong = myInt;

// Kompiliert, ist der effizienteste Weg und macht deutlich, dass der Quellwert NULL ist und niemals NULL sein wird.

Long myLong = (long) myInt;

3

Wir werden den langen Wert unter Verwendung der NumberReferenz erhalten.

public static long toLong(Number number){
    return number.longValue();
}

Es funktioniert für alle Zahlentypen, hier ist ein Test:

public static void testToLong() throws Exception {
    assertEquals(0l, toLong(0));   // an int
    assertEquals(0l, toLong((short)0)); // a short
    assertEquals(0l, toLong(0l)); // a long
    assertEquals(0l, toLong((long) 0)); // another long
    assertEquals(0l, toLong(0.0f));  // a float
    assertEquals(0l, toLong(0.0));  // a double

}

3
 1,new Long(intValue);
 2,Long.valueOf(intValue);

2

Ich hatte große Probleme damit. Ich wollte nur:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

Wobei IntervalCount ein Long ist und der JSpinner so eingestellt wurde, dass er einen Long zurückgibt. Schließlich musste ich diese Funktion schreiben:

    public static final Long getLong(Object obj) throws IllegalArgumentException {
    Long rv;

    if((obj.getClass() == Integer.class) || (obj.getClass() == Long.class) || (obj.getClass() == Double.class)) {
        rv = Long.parseLong(obj.toString());
    }
    else if((obj.getClass() == int.class) || (obj.getClass() == long.class) || (obj.getClass() == double.class)) {
        rv = (Long) obj;
    }
    else if(obj.getClass() == String.class) {
        rv = Long.parseLong(obj.toString());
    }
    else {
        throw new IllegalArgumentException("getLong: type " + obj.getClass() + " = \"" + obj.toString() + "\" unaccounted for");
    }

    return rv;
}

das scheint den Trick zu tun. Keine Menge einfachen Castings, keine der oben genannten Lösungen hat bei mir funktioniert. Sehr frustrierend.


1
Wenn jPaidCountSpinner.getValue()ein Objekt zurückgegeben wird, das tatsächlich a ist Long, müssen Sie definitiv nur einen (Long)Cast vorlegen. Versuchen Sie auch, einen Haltepunkt auf Ihren Scheck für int.classoder long.classusw. zu setzen. Trifft er ihn jemals? Und wenn Sie ein zahlenähnliches Objekt haben, wird es unterstützt java.util.Number, also wandeln Sie es in dieses um und rufen Sie die longValueMethode auf. In diesem Fall müssen Sie keine Zeichenfolge verwenden. Diese Funktion könnte also erheblich vereinfacht werden, selbst wenn Sie sich auch mit Zeichenfolgen befassen müssen. (Ein Teil des Problems hier ist die schlechte Referenzdokumentation für JSpinner).
Daniel Earwicker

1
Auch ich habe so etwas gemacht. Ich war mir nicht sicher, welche Art von Nummer ich erhalten würde, und war bereit, sie in Long umzuwandeln, ohne auf Effizienz zu achten, aber auf Boilerplate verzichten zu wollen.
Profiterole

2
 //Suppose you have int and you wan to convert it to Long
 int i=78;
 //convert to Long
 Long l=Long.valueOf(i)

0

Sobald es nur noch eine Methode gibt Long.valueOf(long), wird bei Verwendung implizit von intbis gegossen .longLong.valueOf(intValue)

Der klarere Weg, dies zu tun, ist

Integer.valueOf(intValue).longValue()

longValueist nur ein (long), also ist das einzige, was Sie hier "gewinnen" Integer, der interne Cache.
Martin Schröder
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.