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