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