web-dev-qa-db-fra.com

Comment spécifiez-vous un littéral d'octet en Java?

Si j'ai une méthode

void f(byte b);

comment puis-je l'appeler avec un argument numérique sans casting?

f(0);

donne une erreur.

218
Charbel

Vous ne pouvez pas. Une constante numérique de base est considérée comme un entier (ou un long si elle est suivie d'un "L"), vous devez donc explicitement la convertir en octet pour la passer en paramètre. Pour autant que je sache, il n'y a pas de raccourci.

272
Robin

Vous devez lancer, j'ai peur:

f((byte)0);

Je crois que cela va effectuer la conversion appropriée à compiler - heure au lieu de exécution heure, donc cela ne va pas réellement causer de pénalité de performance. C'est juste gênant :(

111
Jon Skeet

Vous pouvez utiliser un littéral d'octet en Java ... en quelque sorte.

    byte f = 0;
    f = 0xa;

0xa (littéral int) est automatiquement converti en octet. Ce n'est pas un vrai octet littéral (voir JLS & commentaires ci-dessous), mais si ça plaisante comme un canard, je l'appelle un canard.

Ce que vous ne pouvez pas faire, c'est ceci:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Vous devez lancer comme suit:

 foo( (byte) 0xa ); 

Mais gardez à l'esprit que ceux-ci seront tous compilés et qu'ils utilisent des "littéraux d'octets":

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

    foo( f = 'a' ); //compiles

    foo( f = 1 );  //compiles

Bien sûr, cela compile aussi

    foo( (byte) 1 );  //compiles
28
RickHigh

Si vous passez des littéraux dans le code, qu'est-ce qui vous empêche de simplement le déclarer à l'avance?

byte b = 0; //Set to desired value.
f(b);
10
Mike Yockey

Qu'en est-il de remplacer la méthode avec

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

cela permettra à f(0)

5
Boris Pavlović