Я не знаю, чому це посилається на довгий тип даних як int
Це не так. Ви повинні навчитися довіряти повідомленням компілятора (особливо коли вони надходять від здорових, сучасних компіляторів, а не давніх компіляторів C / C ++). Хоча мову, якою вони говорять, часом важко розгадати, вони, як правило, не брешуть вам.
Подивимось ще раз:
Буквал int 9223372036854775807 вийшов за межі діапазону.
Зверніть увагу, що в ній ніде не згадується ваша змінна testLong
або тип long
, тому це ні про ініціалізацію. Здається, проблема виникає в якомусь іншому моменті.
Тепер давайте дослідимо деякі частини повідомлення:
int
говорить нам, що він хоче ставитися до чогось як до int
цінності (а це не те, що ти хотів!)
- "поза діапазоном" цілком зрозуміло: щось не входить в очікуваний діапазон (ймовірно, в
int
)
- "Буквал": це цікаво: що таке літерал?
Я залишу затишний список, щоб на мить поговорити про літерали: літерали - це місця, де у вашому коді є якесь значення. Існують String
літерали, int
літерали, class
літерали тощо. Кожен раз, коли ви прямо згадуєте значення у своєму коді, це літерал.
Отже, насправді це стосується не декларації змінної, а саме число, значення - це те, про що воно вас дратує.
Ви можете легко перевірити це, використовуючи той самий літерал у контексті, де a long
та an int
однаково прийнятні:
System.out.println(9223372036854775807);
PrintStream.println
може приймати або або (або майже нічого іншого). Тож із цим кодом повинно бути добре, правда?int
long
Ні . Ну, може бути , це повинно бути, але в відповідно до правил , це є НЕ в порядку.
Проблема полягає в тому, що "деякі цифри" визначаються як 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
якщо значення перебувають у межах типів діапазону.