Jak przekonwertować z int na Long w Javie?


219

Ciągle znajduję zarówno tutaj, jak i w Google, którzy mają problemy z przejściem longdo, inta nie na odwrót. Jednak jestem pewien, że nie jestem jedyną osobą, która ma uruchomić w tym scenariuszu przed pójściem od intcelu Long.

Jedyne inne odpowiedzi, jakie znalazłem, to „po prostu ustaw jako długie”, co tak naprawdę nie odnosi się do pytania.

Początkowo próbowałem przesyłać, ale dostaję „ 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);
}

Jak możesz sobie wyobrazić, jestem trochę zakłopotany, utknąłem przy użyciu, intponieważ niektóre treści przychodzą jako, ArrayLista jednostka, dla której przechowuję te informacje, wymaga numeru sekwencyjnego jako Długiego.


for (long i = 0; i <myList.size (); ++ i) też działa
Instantsoup

@Instantsoup Tak, że będzie pracować dla pętli, ale jak podano w dolnej części mojego pytania ArrayList pracuję z pierwotną wymaga int podczas określania jakiej pozycji indeksu dostać
Ghosty

long longValue = intValue | 0L;
Daniel Jipa

To, co zrobiłem, to: najpierw przesłać intdo long, a następnie przypisać longdo Long. np.int x = 2; Long y = (long)x;
Eric Wang

Odpowiedzi:


244

Zauważ, że istnieje różnica między rzutem na longa rzutowaniem na Long. Jeśli rzutujesz na long(prymitywną wartość), to powinna ona zostać automatycznie zapakowana w pole Long(typ odwołania, który ją otacza).

Alternatywnie można użyć newdo utworzenia instancji Long, inicjując ją intwartością.


31
Aby zademonstrować, co powiedział Earwicker, możesz wywołać Long.valueOf (i), co zajmuje dużo czasu, ale poszerzy liczbę całkowitą i zwróci obiekt Długi.
Grundlefleck,

1
Autoboxing jest preferowany, ponieważ niekoniecznie musi za Longkażdym razem tworzyć nowy obiekt.
Michael Myers

2
(Ostrzeżenie: reszta tego komentarza to zgadywanie i przypuszczenie) Jeśli wartości podane w Long.valueOf () mieszczą się w przedziale od 0 do 128, co jest bardzo powszechne i zwraca instancję z pamięci podręcznej, czy będzie to lepsze niż autoboxing? (Mogę zadać nowe pytanie, jeśli uważasz, że warto ...)
Grundlefleck,

4
Autoboxing robi to samo. Nawiasem mówiąc, jest między -127 a 128.
Daniel Earwicker

6
@Grundlefleck: Autoboxing używa Long.valueOf()(o ile dobrze pamiętam), więc nie byłoby żadnej różnicy. Mój komentarz był odpowiedzią na odpowiedź, a nie na twój komentarz.
Michael Myers

193

Użyj następujących: Long.valueOf(int);.


5
Uważaj, ponieważ spowoduje to wygenerowanie wyjątku NullPointerException, jeśli otrzymujesz obiekt typu Integer o wartości null.
will824,

2
poprawne, jeśli jestem wron, myślałem, że odpowiedź może być stara, ponieważ nie mogę znaleźć metodyLong.valueOf(int) !!
shareef

5
@ will824 - pierwotna zmienna „int” nie może mieć wartości NULL.
Rondo

1
@shareef - patrz komentarz serga - ale myślę, że ta metoda rzuca int na długi, który autoboxuje się z długim ... więc wydaje się zbędny
Rondo

1
@Rondo an Integercan, tak powiedział.
Moira

17

Jeśli masz już liczbę całkowitą wpisaną jako Liczba całkowita, możesz to zrobić:

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


6

Mam tę małą zabawkę, która również zajmuje się nietypowymi interfejsami. Nie przeszkadza mi zgłoszenie wyjątku ClassCastException, jeśli plik danych jest nieprawidłowy (OK i szczęśliwy)

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

6

W Javie możesz:

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

w twoim przypadku byłoby to:

content.setSequence(new Long(i));

6

Co powiesz na

int myInt = 88;

// Nie skompiluje się

Long myLong = myInt;

// Kompiluje i zachowuje ducha int nie-NULL. Najlepsza obsada jest nie oddanych w ogóle . Oczywiście, twój przypadek użycia może wymagać Długich i możliwych wartości NULL. Ale jeśli int lub inne długie są twoim jedynym wejściem, a twoja metoda może być modyfikowana, sugerowałbym to podejście.

long myLong = myInt;

// Kompiluje, jest najbardziej wydajnym sposobem i wyjaśnia, że ​​wartość źródłowa jest i nigdy nie będzie NULL.

Long myLong = (long) myInt;

3

Dłuższą wartość uzyskamy, korzystając z Numberreferencji.

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

Działa dla wszystkich typów liczb, oto 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

}


2

Miałem z tym wiele problemów. Chciałem tylko:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

Gdzie IntervalCount jest Long, a JSpinner został ustawiony na zwrócenie Long. W końcu musiałem napisać tę funkcję:

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

co wydaje się załatwić sprawę. Brak ilości prostego odlewania, żadne z powyższych rozwiązań nie działało dla mnie. Bardzo frustrujące.


1
jeśli jPaidCountSpinner.getValue()zwróci Obiekt, który jest w rzeczywistości Long, zdecydowanie wystarczy postawić (Long)gips na pierwszym planie . Także spróbuj umieścić punkt przerwania na czeku za int.classlub long.classitd. Czy kiedykolwiek uderzył go? A jeśli masz obiekt podobny do liczby, będzie on obsługiwał java.util.Number, więc rzuć go na to i wywołaj longValuemetodę. W takim przypadku nie trzeba przechodzić przez łańcuch. Tak więc tę funkcję można nieco uprościć, nawet jeśli trzeba również radzić sobie z łańcuchami. (Część problemu tutaj to zła dokumentacja referencyjna JSpinner).
Daniel Earwicker

1
Ja też skończyłem robić coś takiego. Nie byłam pewna, jaką liczbę otrzymam i byłam gotowa przekonwertować ją na Long z niewielką troską o wydajność, ale chcąc uniknąć płyty kotłowej.
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

Gdy tylko będzie dostępna metoda Long.valueOf(long), rzutowanie z intna longzostanie wykonane domyślnie w przypadku użycia Long.valueOf(intValue).

Bardziej wyraźnym sposobem na to jest

Integer.valueOf(intValue).longValue()

longValuejest po prostu (long), więc jedyną rzeczą, którą „zyskujesz”, jest Integerwewnętrzna pamięć podręczna.
Martin Schröder,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.