b6 funciona debido al estrechamiento en tiempo de compilación de las constantes literales. b7 no funciona porque en tiempo de compilación estrechamiento se limita a todas las primitivas pero de largo (un poco extraño, no sé por qué)
La parte interesante es §5.2 of the JLS:
In addition, if the expression is a constant expression (§15.28) of type byte, short, char or int :
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is :
- Byte and the value of the constant expression is representable in the
type byte.
- Short and the value of the constant expression is representable in
the type short.
- Character and the value of the constant expression is representable in the type char.
If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs.
idea de por qué i
no funciona aunque - la ampliación debería funcionar bien y, de hecho, el compilador debería generar algo como Integer.valueOf((byte)3);
de todos modos. Usar la llamada explícita funciona como se espera, es decir, se está ampliando.
Curiosamente usando el compilador de Java de eclipse Integer i = (byte) 3;
compila muy bien, lo que me lleva a creer que acaba de encontrar un error en javac - ¡felicidades! (bueno, o eso o un error en el compilador de eclipse, pero el comportamiento de eclipse me parece el correcto). FWIW He informado el error contra javac a oráculo ...
Encontrar la pieza correcta en el JLS fue menos trabajo que formatear esto que es algo legible, por lo que probablemente sea más fácil si sigues el enlace.
Sin los mensajes de error y los números de línea de las quejas, esto es bastante difícil de responder. – bmargulies
Además, 'byte x = 126 + 1;' funciona pero no 'byte y = 126 + 2;' De alguna manera, cuando se usa un valor computable, el compilador verifica si el contenedor es lo suficientemente ancho. Sin embargo, no puedo encontrar la referencia en el JLS. – gawi
Esto se discute extensamente en las respuestas a esta pregunta: [link] (http://stackoverflow.com/questions/81392/java-why-do-i-receive-the-error-message-type-mismatch-cannot -convert-int-to-b) –