Nie wiem, dlaczego odnosi się do typu danych long jako int
Nie jest. Powinieneś nauczyć się ufać komunikatom kompilatora (zwłaszcza, gdy pochodzą one od rozsądnych, nowoczesnych kompilatorów, a nie starożytnych kompilatorów C / C ++). Chociaż język, którym mówią, może być czasami trudny do rozszyfrowania, zwykle nie kłamią.
Spójrzmy na to jeszcze raz:
Literał int 9223372036854775807 jest poza zakresem.
Zauważ, że to nie wspominając o zmiennej testLong
lub typu long
wszędzie, więc to nie o inicjalizacji. Wydaje się, że problem pojawia się w innym miejscu.
Teraz zbadajmy niektóre części wiadomości:
int
mówi nam, że chce traktować coś jako int
wartość (która nie jest tym, czego chciałeś!)
- „poza zasięgiem” jest całkiem jasne: coś nie mieści się w oczekiwanym zakresie (prawdopodobnie z
int
)
- „Dosłowne”: to interesujące: co to jest dosłowne?
Zostawię przytulną listę, aby porozmawiać przez chwilę o literałach: literały to miejsca, w których masz jakąś wartość w swoim kodzie. Istnieją String
literały, int
literały, class
literały i tak dalej. Za każdym razem, gdy wyraźnie wymieniasz wartość w swoim kodzie, jest to literał.
Więc tak naprawdę nie dręczy cię deklaracja zmiennej, ale sama liczba, wartość jest tym, o co cię dręczy.
Możesz to łatwo sprawdzić, używając tego samego literału w kontekście, w którym a long
i an int
są równie dopuszczalne:
System.out.println(9223372036854775807);
PrintStream.println
można wziąć albo lub (lub prawie nic innego). Więc ten kod powinien być w porządku, prawda?int
long
Nie. Może powinno być, ale zgodnie z zasadami nie jest w porządku.
Problem polega na tym, że „niektóre cyfry” są zdefiniowane jako int
dosłowne i dlatego muszą znajdować się w zakresie określonym przez int
.
Jeśli chcesz napisać long
literał, musisz to wyraźnie zaznaczyć, dodając L
(lub małe litery l
, ale zdecydowanie sugeruję, abyś zawsze używał wariantu z dużymi literami , ponieważ jest znacznie łatwiejszy do odczytania i trudniejszy do pomylenia z a 1
).
Zauważ, że podobny problem występuje z float
(postfix F
/ f
) i double
(postfix D
/ d
).
Uwaga boczna: zdasz sobie sprawę, że nie ma żadnych literałów byte
lub short
i nadal możesz przypisywać wartości (zwykle int
literały) do byte
i short
zmiennym: jest to możliwe dzięki specjalnym regułom w § 5.2 dotyczącym konwersji przypisania : pozwalają one na przypisanie stałych wyrażeń większego typu do byte
, short
, char
lub int
jeśli wartości są w zasięgu typy.