Чтобы понять, что здесь происходит, вам нужно немного понять целочисленные литералы.
В Java существует два вида целочисленных литералов.
AДлинный литерал имеет суффикс «L» и должен находиться в диапазоне от -2 ^ 63 до + 2 ^ 63 - 1. Он имеет тип long
.
Литерал Int имеетбез суффикса и должен находиться в диапазоне от -2 ^ 31 до + 2 ^ 31 - 1. Он имеет тип int
.
Целочисленный литерал, выходящий за пределы предписанного диапазонаэто ошибка компиляции, независимо от контекста.Таким образом:
long sarah = 9000000000;
является ошибкой компиляции, несмотря на то, что это «число» совместимо с типом на LHS.Аналогично:
Long fred = new Long(9000000000);
- ошибка компиляции ... по той же причине.
Решение состоит в том, чтобы добавить суффикс L;например,
long sarah = 9000000000L;
Long fred = new Long(9000000000L);
(На самом деле, я сказал маленькую белую ложь в приведенном выше. JLS на самом деле утверждает, что целочисленный литерал не подписан, и что то, что выглядит как "«отрицательный литерал» на самом деле является выражением, использующим унарный оператор минус. Следовательно, допустимые целочисленные литеральные значения составляют от 0 до + 2 ^ 31 - 1 (для целых) и от 0 до + 2 ^ 63 - 1 (для длинных). Литералы 2 ^31 и 2 ^ 63, используемые для выражения Integer.MIN_VALUE и Long.MIN_VALUE являются особыми случаями ... они только допустимы, когда им предшествует унарный минус.)