@oliholz que es abatido con sobrecarga de análisis adicional
Ben Barkay
Respuestas:
284
No puedes. Una constante numérica básica se considera un entero (o largo si va seguido de una "L"), por lo que debe convertirlo explícitamente en un byte para pasarlo como parámetro. Que yo sepa, no hay atajos.
Si está haciendo mucho de este tipo de cosas, puede definir un método auxiliar simple en byte b(int i) { return (byte) i; }algún lugar e importarlo estáticamente. Entonces puedes escribir f (b (10)).
Yona Appletree
125
Tienes que echar, me temo:
f((byte)0);
Creo que realizará la conversión adecuada en tiempo de compilación en lugar de tiempo de ejecución , por lo que en realidad no causará penalizaciones de rendimiento. Es un inconveniente :(
+1 para la conversión en tiempo de compilación. Es de sentido común si ambos entienden los compiladores y tienen fe en los diseñadores de idiomas (que deberíamos), pero por lo demás no es tan obvio.
Philip Guin
31
Puede usar un byte literal en Java ... más o menos.
byte f =0;
f =0xa;
0xa(literal literal) se convierte automáticamente en byte. No es un literal de byte real (ver JLS y comentarios a continuación), pero si grazna como un pato, lo llamo pato.
Lo que no puedes hacer es esto:
void foo(byte a){...}
foo(0xa);// will not compile
Tienes que lanzar de la siguiente manera:
foo((byte)0xa);
Pero tenga en cuenta que todo esto se compilará, y están usando "literales de byte":
void foo(byte a){...}byte f =0;
foo( f =0xa);//compiles
foo( f ='a');//compiles
foo( f =1);//compiles
Estos no son literales de byte. Son literales de una variedad de otros tipos (int, principalmente) que se están convirtiendo implícitamente en un byte. Por ejemplo, 1es un int literal, pero se double d = 1;compila muy bien.
smehmood
Si ya estás usando trucos. Tenga una importación estática de byte b(int i){}, luego b(1)tan larga y menos difícil que f=1.
Elazar Leibovich
1
@smehmood, pero dado que la conversión la realiza el precompilador / compilador (incluso antes de que el programa comience a ejecutarse) y no el tiempo de ejecución, entonces es literal, ¿no?
Pacerier
2
@Pacerier Es un literal. No es un "byte literal". Es un int. El compilador lo trata como un literal int (como debería) y realiza un downcast implícito en la asignación (como también debería hacerlo). En ningún momento se analiza como un "byte literal" (que no existe). Consulte la sección 5.2 de JLS, en particular, la última mitad sobre el estrechamiento de las conversiones. Las únicas cosas involucradas son una constante entera y la aplicación de una regla de conversión de asignación apropiada a una variable de byte.
Jason C
Di esta respuesta +1 porque la técnica es novedosa, pero de hecho, no hay "byte literales" en Java.
12
Si está pasando literales en código, ¿qué le impide declararlo con anticipación?
-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 byte puede contener. ¡Desanimo a las personas a usar este método!
Rolf ツ
3
Además, este elenco sucederá en tiempo de ejecución. Muy mal.
BrainSlugs83
Completamente de acuerdo con Rolf (Tsu), quizás valga la pena agregar, que técnicamente está sobrecargando, no anulando.
Cromax
-2
Con Java 7 y versiones posteriores, puede especificar un byte literal de esta manera:
byte aByte = (byte)0b00100001;
Respuestas:
No puedes. Una constante numérica básica se considera un entero (o largo si va seguido de una "L"), por lo que debe convertirlo explícitamente en un byte para pasarlo como parámetro. Que yo sepa, no hay atajos.
fuente
byte b(int i) { return (byte) i; }
algún lugar e importarlo estáticamente. Entonces puedes escribir f (b (10)).Tienes que echar, me temo:
Creo que realizará la conversión adecuada en tiempo de compilación en lugar de tiempo de ejecución , por lo que en realidad no causará penalizaciones de rendimiento. Es un inconveniente :(
fuente
Puede usar un byte literal en Java ... más o menos.
0xa
(literal literal) se convierte automáticamente en byte. No es un literal de byte real (ver JLS y comentarios a continuación), pero si grazna como un pato, lo llamo pato.Lo que no puedes hacer es esto:
Tienes que lanzar de la siguiente manera:
Pero tenga en cuenta que todo esto se compilará, y están usando "literales de byte":
Por supuesto, esto también se compila
fuente
1
es un int literal, pero sedouble d = 1;
compila muy bien.byte b(int i){}
, luegob(1)
tan larga y menos difícil quef=1
.Si está pasando literales en código, ¿qué le impide declararlo con anticipación?
fuente
public static final byte BYTE_MASK = ( byte )0xff;
byte BYTE_MASK = 0x000000ff;
para no tener algunos errores de extensión de signos desagradables.¿Qué hay de anular el método con
esto permitirá
f(0)
fuente
Con Java 7 y versiones posteriores, 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
fuente