Я не знаю, почему он относится к длинному типу данных как к 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
если значения находятся в пределах типов диапазона.