Não sei por que está se referindo ao tipo de dados longo como um int
Não é. Você deve aprender a confiar nas mensagens do compilador (especialmente quando são de compiladores sãos e modernos, e não de compiladores C / C ++ antigos). Embora a linguagem que eles falam possa ser difícil de decifrar às vezes, eles geralmente não estão mentindo para você.
Vamos olhar de novo:
O literal de int 9223372036854775807 está fora do intervalo.
Observe que ele não menciona sua variável testLong
ou o tipo em long
lugar nenhum, portanto, não é sobre a inicialização. O problema parece ocorrer em algum outro ponto.
Agora vamos investigar algumas das partes da mensagem:
int
nos diz que deseja tratar algo como um int
valor (que não é o que você queria!)
- "fora do intervalo" é bastante claro: algo não está dentro do intervalo esperado (provavelmente de
int
)
- "O literal": isso é interessante: o que é um literal?
Vou deixar a lista aconchegante para falar sobre literais por um momento: literais são lugares onde você tem algum valor em seu código. Existem String
literais, int
literais, class
literais e assim por diante. Cada vez que você menciona um valor explicitamente em seu código, é um literal.
Portanto, não está realmente incomodando você sobre a declaração da variável, mas o próprio número, o valor é o que está incomodando você.
Você pode verificar isso facilmente usando o mesmo literal em um contexto onde a long
e an int
são igualmente aceitáveis:
System.out.println(9223372036854775807);
PrintStream.println
pode levar umint
ou umlong
(ou praticamente qualquer outra coisa). Então esse código deve estar bem, certo?
Não. Bem, talvez devesse ser, mas de acordo com as regras não está bem.
O problema é que "alguns dígitos" são definidos como int
literais e, portanto, devem estar no intervalo definido por int
.
Se você quer escrever um long
literal, então você deve fazer que explícita, acrescentando o L
(caso ou menor l
, mas eu altamente sugiro que você use sempre a variante maiúsculas, porque é muito mais fácil de ler e mais difícil de erro para um 1
).
Observe que um problema semelhante ocorre com float
(postfix F
/ f
) e double
(postfix D
/ d
).
Nota lateral: você perceberá que não há byte
ou short
literais e ainda pode atribuir valores (geralmente int
literais) a variáveis byte
e short
: isso é possível devido a regras especiais no § 5.2 sobre Assignment Converson : eles permitem a atribuição de expressões constantes de um tipo maior a byte
, short
, char
ou int
, se os valores estão dentro dos tipos variam.