No sé por qué se está refiriendo al tipo de datos siempre que un int
no lo es. Debes aprender a confiar en los mensajes del compilador (especialmente cuando proceden de compiladores modernos y no antiguos compiladores C/C++). Si bien el idioma que hablan puede ser difícil de descifrar a veces, por lo general no te mienten.
Veamos de nuevo:
El literal de int 9223372036854775807 está fuera del intervalo.
Nota, que no mencionar la variable de testLong
o el tipo long
en cualquier lugar, por lo que es no acerca de la inicialización. El problema parece ocurrir en algún otro punto.
Ahora vamos a investigar algunas de las partes del mensaje: (que no es lo que quería)
int
nos dice que quiere tratar algo como un valor int
- "fuera de rango "es bastante claro: algo no está dentro del rango esperado (probablemente el de
int
)
- " The literal ": ahora eso es interesante: ¿qué es un literal?
Dejaré la lista para hablar de literales por un momento: los literales son lugares donde tiene algún valor en su código. Hay literales String
, literales int
, literales class
y así sucesivamente.Cada vez que se menciona un valor explícitamente en el código, que es un literal.
así que no es en realidad le persistentes acerca de la declaración de variables, pero el número en sí, el valor es lo que le está insistiendo que quería.
usted puede fácilmente verificar esto usando la misma literal en un contexto donde un long
y un int
son igualmente aceptables:
System.out.println(9223372036854775807);
PrintStream.println
puede tomar cualquiera an int
o a long
(o casi cualquier otra cosa). Entonces ese código debería estar bien, ¿verdad?
No. Bueno, tal vez debería ser, pero de acuerdo con las reglas que es no está bien.
El problema es that "some digits" is defined to be an int
literal y por lo tanto debe estar en el intervalo definido por int
.
Si desea escribir un long
literal, entonces usted debe hacer que explícita añadiendo el L
(o minúsculas l
, pero altamente sugiere utilizar siempre la variante en mayúsculas, porque es mucho más fácil de leer y más difícil de confundir con un 1
).
Tenga en cuenta que un problema similar se produce con float
(postfix F
/f
) y double
(postfix D
/d
).
nota
lateral: se dará cuenta de que no hay byte
o short
literales y todavía se puede asignar valores (generalmente int
literales) a byte
y short
variables: eso es posible debido a las reglas especiales en § 5.2 about Assignment Converson: permiten la asignación de la constante expresiones de un tipo más grande a byte
, short
, char
o int
si los valores están dentro del rango de tipos.
Por cierto: ¿qué compilador estás usando? Tanto Eclipse como el compilador Sun JDK dan diferentes (en mi opinión, mejor) mensaje de error para este problema. –