2011-03-04 14 views

Respuesta

226

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.

+8

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)). –

+10

Porque esta es la forma de Java. Lo siento Dave, me temo que no puedo hacer eso. –

+12

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

4

¿Qué pasa con la sustitución del método con

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

esto permitirá f(0)

+23

-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! –

+3

Además, este lanzamiento sucederá en tiempo de ejecución. Muy mal. – BrainSlugs83

+0

Totalmente de acuerdo con Rolf (Tsu), tal vez valga la pena agregar, que técnicamente es sobrecargar, no anular. – Cromax

8

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); 
+0

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 –

+0

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. –

+0

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

86

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 :(

+8

+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

22

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 
+15

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

+0

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'. –

+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

Cuestiones relacionadas