¿Cómo se especifica un byte literal en Java?

238

Si tengo un metodo

void f(byte b);

¿Cómo puedo llamarlo con un argumento numérico sin conversión?

f(0);

da un error

Charbel
fuente
1
@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.

Robin
fuente
11
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 :(

Jon Skeet
fuente
11
+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

Por supuesto, esto también se compila

    foo( (byte) 1 );  //compiles
RickHigh
fuente
17
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?

byte b = 0; //Set to desired value.
f(b);
Mike Yockey
fuente
1
Esto también le permite dar al valor un nombre más semántico. en.wikipedia.org/wiki/…
Aaron J Lang
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.
Sin embargo, el compilador se quejó de lo siguiente y necesitaba agregar el elenco: public static final byte BYTE_MASK = ( byte )0xff;
Marvo
Y me di cuenta de que realmente quería byte BYTE_MASK = 0x000000ff;para no tener algunos errores de extensión de signos desagradables.
Marvo
5

¿Qué hay de anular el método con

void f(int value)
{
  f((byte)value);
}

esto permitirá f(0)

Boris Pavlović
fuente
26
-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