Я не знаю, чому це посилається на довгий тип даних як int
Це не так. Ви повинні навчитися довіряти повідомленням компілятора (особливо коли вони надходять від здорових, сучасних компіляторів, а не давніх компіляторів C / C ++). Хоча мову, якою вони говорять, часом важко розгадати, вони, як правило, не брешуть вам.
Подивимось ще раз:
Буквал int 9223372036854775807 вийшов за межі діапазону.
Зверніть увагу, що в ній ніде не згадується ваша змінна testLongабо тип long, тому це ні про ініціалізацію. Здається, проблема виникає в якомусь іншому моменті.
Тепер давайте дослідимо деякі частини повідомлення:
int говорить нам, що він хоче ставитися до чогось як до int цінності (а це не те, що ти хотів!)
- "поза діапазоном" цілком зрозуміло: щось не входить в очікуваний діапазон (ймовірно, в
int )
- "Буквал": це цікаво: що таке літерал?
Я залишу затишний список, щоб на мить поговорити про літерали: літерали - це місця, де у вашому коді є якесь значення. Існують Stringлітерали, intлітерали, classлітерали тощо. Кожен раз, коли ви прямо згадуєте значення у своєму коді, це літерал.
Отже, насправді це стосується не декларації змінної, а саме число, значення - це те, про що воно вас дратує.
Ви можете легко перевірити це, використовуючи той самий літерал у контексті, де a longта an intоднаково прийнятні:
System.out.println(9223372036854775807);
PrintStream.printlnможе приймати або або (або майже нічого іншого). Тож із цим кодом повинно бути добре, правда?intlong
Ні . Ну, може бути , це повинно бути, але в відповідно до правил , це є НЕ в порядку.
Проблема полягає в тому, що "деякі цифри" визначаються як intлітерал і, отже, повинні знаходитися в діапазоні, визначеному int.
Якщо ви хочете написати longлітерал, то ви повинні зробити це явним, додавши L(або нижній регістр l, але я настійно рекомендую завжди використовувати верхній регістр, тому що це набагато легше читати і важче помилково прийняти за1 ).
Зверніть увагу, що подібна проблема виникає з float(postfix F/ f) та double(postfix D/d ).
Побічна примітка: ви зрозумієте, що їх немає byteабо shortлітералів, і ви все ще можете призначати значення (як правило, intлітерали) byteі shortзмінним: це можливо завдяки спеціальним правилам у п. 5.2 про Призначення перетворення : вони дозволяють призначати константні вирази більшого типу до byte, short, charабо , int якщо значення перебувають у межах типів діапазону.