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 testLongou o tipo em longlugar nenhum, portanto, não é sobre a inicialização. O problema parece ocorrer em algum outro ponto.
Agora vamos investigar algumas das partes da mensagem:
intnos diz que deseja tratar algo como um intvalor (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 Stringliterais, intliterais, classliterais 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 longe an intsão igualmente aceitáveis:
System.out.println(9223372036854775807);
PrintStream.printlnpode 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 intliterais e, portanto, devem estar no intervalo definido por int.
Se você quer escrever um longliteral, 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á byteou shortliterais e ainda pode atribuir valores (geralmente intliterais) a variáveis bytee 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, charou int , se os valores estão dentro dos tipos variam.