No sé por qué se refiere al tipo de datos largo como int
No lo es. Debe aprender a confiar en los mensajes del compilador (especialmente cuando son de compiladores sanos y modernos y no de compiladores antiguos de C / C ++). Si bien el idioma que hablan puede ser difícil de descifrar en ocasiones, generalmente no te están mintiendo.
Veámoslo de nuevo:
El literal de int 9223372036854775807 está fuera de rango.
Tenga en cuenta que no menciona su variable testLongo el tipo en longninguna parte, por lo que no se trata de la inicialización. El problema parece ocurrir en algún otro momento.
Ahora investiguemos algunas de las partes del mensaje:
intnos dice que quiere tratar algo como un intvalor (¡que no es lo que querías!)
- "fuera de rango" es bastante claro: algo no está dentro del rango esperado (probablemente el de
int)
- "El literal": eso es interesante: ¿qué es un literal?
Dejaré la acogedora lista para hablar de literales por un momento: los literales son lugares donde tienes algún valor en tu código. Hay Stringliterales, literales, intliterales, classetc. Cada vez que mencionas un valor explícitamente en tu código, es literal.
Así que no te está molestando por la declaración de la variable, sino por el número en sí, el valor es lo que te molesta.
Puede verificar esto fácilmente utilizando el mismo literal en un contexto donde un long y an intson igualmente aceptables:
System.out.println(9223372036854775807);
PrintStream.println puede tomar cualquiera unaint o unalong (o casi cualquier otra cosa). Entonces ese código debería estar bien, ¿verdad?
No. Bueno, tal vez debería serlo, pero según las reglas no está bien.
El problema es que "algunos dígitos" se define como un intliteral y, por lo tanto, debe estar en el rango definido por int.
Si desea escribir un longliteral, debe hacerlo explícito agregando la L(o minúsculal , pero altamente sugeriría que siempre utilice la variante en mayúsculas, porque es mucho más fácil de leer y más difícil de error para una 1).
Tenga en cuenta que ocurre un problema similar con float(postfix F/f ) y double(postfix D/ d).
Nota al margen: se dará cuenta de que no hay byteo shortliterales y aún puede asignar valores (generalmente intliterales) a bytey shortvariables: eso es posible debido a las reglas especiales en § 5.2 sobre Assignment Converson : permiten la asignación de expresiones constantes de un tipo más grande a byte, short, charo int si los valores están dentro del rango de los tipos.