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 testLonglub typu longwszędzie, więc to nie o inicjalizacji. Wydaje się, że problem pojawia się w innym miejscu.
Teraz zbadajmy niektóre części wiadomości:
intmówi nam, że chce traktować coś jako intwartość (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ą Stringliterały, intliterały, classliterał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 longi an intsą równie dopuszczalne:
System.out.println(9223372036854775807);
PrintStream.printlnmożna wziąć albo lub (lub prawie nic innego). Więc ten kod powinien być w porządku, prawda?intlong
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 intdosłowne i dlatego muszą znajdować się w zakresie określonym przez int.
Jeśli chcesz napisać longliterał, 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 bytelub shorti nadal możesz przypisywać wartości (zwykle intliterały) do bytei shortzmiennym: 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, charlub int jeśli wartości są w zasięgu typy.