Java:¿por qué recibo el mensaje de error "no coinciden los tipos:no se puede convertir int byte"

StackOverflow https://stackoverflow.com/questions/81392

Pregunta

Si usted declarar variables de tipo byte o short y el intento de realizar operaciones aritméticas sobre estos, recibirá el mensaje de error "no coinciden los tipos:no se puede convertir int a corto" (o consecuencia "no coinciden los tipos:no se puede convertir int byte").

byte a = 23;
byte b = 34;
byte c = a + b;

En este ejemplo, el error de compilación es en la tercera línea.

¿Fue útil?

Solución

Aunque los operadores aritméticos son definidos para operar en cualquier tipo numérico, según el lenguaje Java specification (5.6.2 Binario Numérico de la Promoción), los operandos de tipo byte y short pasan automáticamente a int antes de ser entregados a los operadores.

Para realizar las operaciones aritméticas de las variables de tipo byte o short, debe encerrar la expresión entre paréntesis (dentro de la cual las operaciones se llevarán a cabo de tipo int), y luego emitir el resultado de vuelta al tipo deseado.

byte a = 23;
byte b = 34;
byte c = (byte) (a + b);

He aquí una pregunta a la real de Java gurús:por qué?Los tipos byte y short están perfectamente bien los tipos numéricos.¿Por qué Java no permite dirigir las operaciones aritméticas en estos tipos?(La respuesta no es "una pérdida de precisión", ya que no hay razón aparente para convertir a int en el primer lugar.)

Actualización:jrudolph sugiere que este comportamiento se basa en las operaciones disponibles en la JVM, específicamente, que sólo completo y doble palabra a los operadores de aplicación.Por lo tanto, para el operador, en bytes y pantalones cortos, que debe ser convertido a int.

Otros consejos

La respuesta a su pregunta de seguimiento está aquí:

los operandos de tipo byte y short pasan automáticamente a int antes de ser entregados a los operadores

Así que, en tu ejemplo, a y b ambos son convertidos a un int antes de ser entregado al operador+.El resultado de la suma de dos ints juntos es también un int.Tratando de asignar a continuación, que int a un byte valor causas de error debido a que existe un riesgo potencial de pérdida de precisión.Explícitamente casting el resultado que se indica al compilador "yo sé lo que estoy haciendo".

Creo que el asunto es, que la JVM sólo admite dos tipos de pila de valores:palabra y con el tamaño de palabra doble de tamaño.

Entonces probablemente decidieron que tendrían sólo una operación que funciona en la palabra del tamaño de los números enteros en la pila.Así que sólo hay iadd, imul y por lo tanto, en bytecode nivel (y no a los operadores de bytes y cortos).

Así se obtiene un valor int como el resultado de estas operaciones de Java que no es seguro para volver a convertir a los más pequeños de byte y short tipos de datos.Así que fuerza a echar para acotar el valor de regreso a byte o short.

Pero al final tiene el derecho de:Este comportamiento no es coherente con el comportamiento de los enteros, por ejemplo.Usted puede, sin problema de sumar dos enteros y no obtener ningún error si el resultado se desborda.

El lenguaje Java siempre promueve los argumentos de los operadores aritméticos para int, long, float o double.Así que toma la expresión:

a + b

donde a y b son de tipo byte.Esta es la abreviatura de:

(int)a + (int)b

Esta expresión es de tipo int.Claramente no tiene sentido dar un error a la hora de asignar un valor int a un byte variable.

¿Por qué el lenguaje se define de esta manera?Supongamos que una era de 60 y b fue de 70, entonces a+b es -126 - desbordamiento de enteros.Como parte de una expresión más complicada que se espera que resulte en un int, esto puede convertirse en un error difícil.Restringir el uso de byte y short para matriz de almacenamiento, las constantes para los formatos de archivo/protocolos de red y puzzlers.

Hay una interesante grabación de JavaPolis 2007.James Gosling está dando un ejemplo acerca de cómo complicada aritmética sin signo es (y por qué no en Java).Josh Bloch señala que su ejemplo se da el mal ejemplo en condiciones normales firmado aritmética demasiado.Para comprensible aritmética, necesitamos de precisión arbitraria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top