2012-02-20 13 views
9

¿Podría alguien explicar el tipo de byte de Java?¿El tipo de byte de Java es extraño?

Esto no se compila:

byte b1 = 9; 
byte b2 = 1; 
byte b3 = b1 + b2; 

Mientras que esto hace:

byte b4 = 9 + 1; 
byte b5 = (char)(9+1); 

Además, la asignación a una larga no funciona, incluso si el valor se ajusta a un byte:

byte b7 = (long)127; 

Se hace aún más raro con envolturas

Esto compila:

Byte b6 = (int)3; 

Pero esto no es así:

Integer i = (byte)3; 
+1

Sin los mensajes de error y los números de línea de las quejas, esto es bastante difícil de responder. – bmargulies

+0

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

+0

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) –

Respuesta

3

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.

+0

También me confundí ... Supuse que se traduciría a algo así como = new Integer ((byte) 3)); Pero eso realmente funcionaría ... Supongo que no está realmente aclarado en el JLS – 0x434D53

+0

@CSE No, el compilador usa el método 'valueOf' (como cualquier persona que use las API Wrapper, el constructor realmente no debería ser público) , pero sí me parece un error porque la llamada explícita realmente funciona. [Aquí está] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7147289) el informe de errores, que aún no ha sido revisado por Oracle a la fecha de redacción, probablemente demorará unos días. – Voo

-1

primer fragmento produce error de compilación debido a todas las constantes numéricas son por defecto int s en Java.

+2

Pero entonces las dos primeras filas deberían fallar? – 0x434D53

+0

Cuidado para explicar un voto a favor, por favor. – Roman

+0

@CSE: eso es exactamente lo que describí en esta respuesta. – Roman

8

Especificación del lenguaje Java 5.6.2 Promoción binaria numérica: "De lo contrario, ambos operandos se convierten tipo int".

Así que Java convierte ambos operandos a y int, por lo que el resultado de la adición es un int.

Adición: La diferencia entre b3 y b4 es que en b4 es una expresión constante (15.28), en b3 es literal.

+0

JVM Spec, tiene todo lo que necesita. http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#16021 – jn1kk

+0

¿Qué está pasando con las clases contenedoras? Parece contra intuitivo que un int puede caber en un byte, pero un byte no puede caber en un entero. –

+0

Aún tratando de descubrir los Wrappers. Es bastante difícil averiguar qué sucedería de las especificaciones. – 0x434D53

Cuestiones relacionadas