Autoboxing / ensanchamiento se produce en corto a = 3, pero no en Float a = 3;
-
01-10-2019 - |
Pregunta
Yo entiendo que el siguiente código no funcionará
Float a=3
porque su traducido como Float a = Integer.valueOf (3). Vamos a tener una referencia del flotador en el LHS y un objeto entero en el lado derecho, que es incompatible. Pero:
1.
`Short a=3;`
Estos trabajos, aunque aquí de nuevo, vamos a tener una referencia breve en el LHS y un objeto entero en el lado derecho.
2.
Float a=(Float) 3
Si no hubiéramos typecasted 3, habría sido traducido como Integer.valueOf (3). Ahora, tendrá que ser traducido como Float.valueOf (3)?
Solución
Si intenta inicializar una variable con un valor más grande que puede contener (independientemente de la forma numérica del valor), el compilador le dará un mensaje de error.
char c = 0xffff; // max char hex value
byte b = 0x7f; // max byte hex value
short s = 0x7fff; // max short hex value
Aviso en el código por encima de los valores máximos posibles hexadecimales para char, byte, y corta. Si supera estos, el compilador automáticamente hará que el valor de un int y le dirá que necesita un molde estrechamiento de la asignación. Usted sabrá que ha pasado de la raya.
Así que en su caso se convierte en realidad Short s = 3
Short s = new Short(3)
y obras. (No se utilizan métodos ValueOf cuando Autoboxing es por eso que los IDE modernos tienen opciones para marcar estos autoboxing como errores y podemos reemplazarlos con el método valueOf para una mejor MGMT de memoria)
En el segundo caso Float a=(Float) 3
se convertirá en Float.valueOf(3)
Otros consejos
Si su pregunta es "¿Por qué flotador f = 3; no se compila, pero Short s = 3; lo hace?", Entonces la respuesta es:
el compilador de Java hace algún trabajo especial sobre constantes enteras para que encajen con el lado de la izquierda: se encuentra el tipo y la utiliza más adecuada. Por lo tanto,
Short s = 3;
se compila a
Short s = Short.valueOf(3);
En esencia, la misma magia que ocurre cuando se escribe
short s = 3;
Pero esto se hace sólo para los números enteros, y no para los valores de coma flotante.
La forma corta es:
Float a=3.0f;
Por tipo doble:
Double b=3.0;
No hay forma de especificar constantes cortos y bytes, por lo que el compilador le permite traducir las constantes int transparente. Hay constantes flotar en Java por lo que no admite traducción implícita. Si quieres un flotador / Float le sugiero que utilice una constante flotador.
Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;