2009-11-02 71 views
16

Las reglas para la promoción son "cuando los operandos son de tipos diferentes, la promoción numérica binaria automática ocurre cuando el tipo de operando más pequeño se convierte en el más grande". Pero los operandos son del mismo tipo, por ejemplo,Promoción en Java?

byte=byte+byte // Compile time error... found int.. 

¿Por qué es así?

+0

Posible duplicado de [¿Por qué no puedo agregar dos bytes y obtener un int y puedo agregar dos bytes finales obtener un byte?] (http://stackoverflow.com/questions/13100019/why-can-noti-i-add-two-bytes-and-get-an-int-and-i-can- add-two-final-bytes-get-ab) –

Respuesta

35

No hay operador + para byte. En cambio, los dos operandos son promovidos a int, por lo que tiene

byte = byte + byte 
... becomes (widening to find + operator) ... 
byte = int + int 
... becomes (result of + operator) ... 
byte = int 

... que a su vez produce un error porque no hay conversión implícita de int a byte. Es necesario para emitir:

byte a = 1; 
byte b = 2; 

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

Éstos son los reglas reales de promoción numérica, desde section 5.6.2 of the JLS:


Cuando un operador aplica promoción numérica binaria a un par de operandos, cada uno de los cuales debe denotan un valor que es convertible a un tipo numérico, se aplican las siguientes reglas, en orden, usando conversión de ampliación (§5.1.2) para convertir operandos según sea necesario:

  • Si cualquiera de los operandos es de un tipo de referencia, se realiza la conversión de unboxing (§5.1.8). Entonces:
  • Si cualquiera de los dos operandos es de tipo doble, el otro se convierte a doble.
  • De lo contrario, si cualquiera de los operandos es del tipo float, el otro se convierte en float.
  • De lo contrario, si alguno de los operandos es de tipo largo, el otro se convierte en largo.
  • De lo contrario, ambos operandos se convierten a tipo int.
+4

gracias Jon, esto es lo que esperaba. Pero una cosa que tengo que preguntar es: ¿Por qué no hay un operador + para byte? – i2ijeya

14

Se le proporcionó la respuesta correcta sobre la promoción automática a 'int'.

Hay una nota más al respecto: los operadores de asignación compuesta se comportan como si tuvieran un caso de tipo implícito. Ejemplo:

byte b1 = 1; 
byte b2 = 2; 
b1 = b1 + b2; // compilation fails 
b1 += b2; // compilation successful 
0

De this SO question, y las respuestas anteriores debido a + operador aritmético, ambos operandos se convierten a escribir int.

byte b1 = 1; 
byte b2 = 2; 
byte b3 = b1 + b2; // compile time error 

En el código anterior, el valor de b1 y b2 será resuelta en tiempo de ejecución, por lo tanto compilador convertir a int antes de resolver el valor.

Pero si tenemos en cuenta el siguiente código,

final byte b1 = 1; 
final byte b2 = 2; 
int b3 = b1 + b2; // constant expression, value resolved at compile time 

b1 y b2 son variables y valores finales serán resueltas en tiempo de compilación por lo que la compilación no fallará.

0

me gustaría hablar de promoción en general

Java puede evaluar expresiones única aritméticas en el que los tipos de los operandos son idénticos

Por ejemplo, en una expresión que contiene int y dobles valores , los valores int se promueven a valores dobles para su uso en la expresión.

en otra palabra

double someVar = 1/2;// someVar = 0 

pero

double someVar = (double)1/2;// someVar = 0.5 

por qué?

  • utilizamos la (doble) cast operator para crear una copia temporary de punto flotante de su operando "1" (se llama explicit conversion)
  • El cálculo se compone actualmente de un valor de punto flotante (el doble copia temporal de las 1) dividido por el número entero 2
  • de acuerdo con la declaración anterior, Java realiza una operación llamada promotion (o conversión implícita), por lo que el int values son promovidos a double values para uso in la expresión => el número entero 2 es promovido a duplicar
  • la expresión se convirtió en double someVar = 1.0/2.0; // someVar= 0.5

esperanza que esto es útil, incluso si está fuera del núcleo de la cuestión

Cuestiones relacionadas