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 testLong
o el tipo en long
ninguna 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:
int
nos dice que quiere tratar algo como un int
valor (¡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 String
literales, literales, int
literales, class
etc. 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 int
son 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 int
literal y, por lo tanto, debe estar en el rango definido por int
.
Si desea escribir un long
literal, 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 byte
o short
literales y aún puede asignar valores (generalmente int
literales) a byte
y short
variables: 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
, char
o int
si los valores están dentro del rango de los tipos.