Si tengo un método¿Cómo se especifica un byte literal en Java?
void f(byte b);
cómo puedo llamar con un argumento numérico sin poner?
f(0);
da un error.
Si tengo un método¿Cómo se especifica un byte literal en Java?
void f(byte b);
cómo puedo llamar con un argumento numérico sin poner?
f(0);
da un error.
No puede. Una constante numérica básica se considera un número entero (o largo si está seguida de una "L"), por lo que debe inclinarla explícitamente a un byte para pasarla como parámetro. Por lo que sé, no hay atajos.
Si está haciendo mucho de este tipo de cosas, puede definir un método de ayuda simple 'byte b (int i) {return (byte) i; } 'en algún lugar e importarlo estáticamente. Entonces puedes escribir f (b (10)). –
Porque esta es la forma de Java. Lo siento Dave, me temo que no puedo hacer eso. –
Muéstrame tu lenguaje de programación perfecto que contiene todas las funciones que cualquier desarrollador podría desear y te mostraré mi mascota, unicornio que hace pis en el arcoiris y mea el champán. – Dave
¿Qué pasa con la sustitución del método con
void f(int value)
{
f((byte)value);
}
esto permitirá f(0)
-1 Esto es muy malo para la legibilidad del código. Y podría causar problemas cuando las personas realmente intentan pasar un valor más alto que el que puede contener el byte. ¡No animo a las personas a usar este método! –
Además, este lanzamiento sucederá en tiempo de ejecución. Muy mal. – BrainSlugs83
Totalmente de acuerdo con Rolf (Tsu), tal vez valga la pena agregar, que técnicamente es sobrecargar, no anular. – Cromax
Si va a ceder literales en el código, lo que te impide simplemente declarar antes de tiempo?
byte b = 0; //Set to desired value.
f(b);
Esto también le permite dar al valor un nombre más semántico. http://en.wikipedia.org/wiki/Magic_number_(programming)#Unnamed_numerical_constants –
Esto es útil. Si está tratando de llenar una matriz de bytes utilizando el método de "relleno" de Java, esto es más sensato. –
El compilador solo se quejó de lo siguiente, sin embargo, y necesitaba agregar el molde: 'byte final público estático BYTE_MASK = (byte) 0xff;' – Marvo
tienen que desechar, me temo:
f((byte)0);
yo creo que va a realizar la conversión apropiada a compilar -tiempo en lugar de la ejecución tiempo, así que no es en realidad va para causar penalizaciones de rendimiento. Es sólo un inconveniente :(
+1 para la conversión en tiempo de compilación. Es de sentido común si ambos comprendemos los compiladores y tenemos fe en los diseñadores de idiomas (lo cual deberíamos), pero por lo demás no es tan obvio. – Philip
Se puede utilizar un literal de bytes en Java ... más o menos.
byte f = 0;
f = 0xa;
0xa
(int literal) obtiene fundido automáticamente a byte. No es un verdadero literal de bytes (ver JLS & comentarios más abajo), pero if it quacks like a duck, I call it a duck.
lo que no puede hacer es lo siguiente:
void foo(byte a) {
...
}
foo(0xa); // will not compile
tienen que desechar como sigue:
foo((byte) 0xa);
Pero hay que tener en cuenta que éstos tengan compilar y que están utilizando "literales byte":
void foo(byte a) {
...
}
byte f = 0;
foo(f = 0xa); //compiles
foo(f = 'a'); //compiles
foo(f = 1); //compiles
Por supuesto, esto compila también
foo((byte) 1); //compiles
Estos no son literales de bytes. Son literales de una variedad de otros tipos (int, principalmente) que se convierten implícitamente en un byte. por ejemplo, '1' es un int literal, pero' double d = 1; 'compila muy bien. – smehmood
Si ya está usando trucos. Tener una importación estática de 'byte b (int i) {}', luego 'b (1)' tan larga y menos complicada que 'f = 1'. –
@smehmood, pero dado que la conversión es hecha por el precompilador/compilador (incluso antes de que el programa comience a ejecutarse) y no por el tiempo de ejecución, entonces es un literal, ¿no es así? – Pacerier
Con Java 7 y versiones posteriores versión, puede especificar un byte literal de esta manera: byte aByte = (byte)0b00100001;
Referencia: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html
* binario * literal! = * Byte * literal. –
@oliholz eso es downcasting con sobrecarga de análisis adicional –