Come si specifica un byte letterale in Java?


238

Se ho un metodo

void f(byte b);

come posso chiamarlo con un argomento numerico senza trasmettere?

f(0);

dà un errore.


1
@oliholz ​​che sta effettuando il downcasting con un ulteriore sovraccarico di analisi
Ben Barkay,

Risposte:


284

Non puoi. Una costante numerica di base è considerata un numero intero (o lungo se seguito da una "L"), quindi è necessario eseguirne esplicitamente il downcast su un byte per passarlo come parametro. Per quanto ne so non c'è scorciatoia.


11
Se stai facendo molto di questo genere di cose, puoi definire un semplice metodo di supporto byte b(int i) { return (byte) i; }da qualche parte e importarlo staticamente. Quindi è possibile scrivere f (b (10)).
Yona Appletree,

125

Devi lanciare, temo:

f((byte)0);

Credo che eseguirà la conversione appropriata in fase di compilazione anziché in fase di esecuzione , quindi non causerà effettivamente penali di prestazione. È solo scomodo :(


11
+1 per la conversione in fase di compilazione. È logico che entrambi comprendiate i compilatori e abbiate fiducia nei progettisti del linguaggio (cosa che dovremmo fare), ma per il resto non è così ovvio.
Philip Guin,

31

È possibile utilizzare un byte letterale in Java ... sorta di.

    byte f = 0;
    f = 0xa;

0xa(int letterale) viene automaticamente trasmesso a byte. Non è un vero byte letterale (vedi JLS e commenti di seguito), ma se si rompe come un'anatra, lo chiamo anatra.

Quello che non puoi fare è questo:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Devi lanciare come segue:

 foo( (byte) 0xa ); 

Ma tieni presente che verranno compilati tutti e utilizzano "valori letterali in byte":

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

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

    foo( f = 1 );  //compiles

Naturalmente anche questo viene compilato

    foo( (byte) 1 );  //compiles

17
Questi non sono letterali byte. Sono letterali di una varietà di altri tipi (int, principalmente) che vengono convertiti implicitamente in un byte. ad esempio, 1è un letterale int, ma double d = 1;compila bene.
smehmood,

Se stai già usando dei trucchi. Hanno un'importazione statica di byte b(int i){}, quindi b(1)più lunga e meno complicata di f=1.
Elazar Leibovich,

1
@smehmood, Ma dal momento che la conversione viene effettuata dal pre-compilatore / compilatore (prima ancora che il programma inizi a funzionare) e non dal runtime, allora è letterale, vero?
Pacerier,

2
@Pacerier È letterale. Non è un "byte letterale". È un int. Il compilatore lo considera come letterale int (come dovrebbe) e esegue un downcast implicito nell'assegnazione (come dovrebbe anche). Non viene mai analizzato come "byte letterale" (che non esiste). Vedi la sezione 5.2 di JLS, in particolare la seconda metà riguardante il restringimento delle conversioni. Le uniche cose coinvolte sono una costante intera e l'applicazione di una regola di conversione di assegnazione appropriata in una variabile byte.
Jason C,

Ho dato questa risposta +1 perché la tecnica è nuova, ma in realtà non ci sono "byte letterali" in Java.

12

Se passi letterali nel codice, cosa ti impedisce di dichiararlo in anticipo?

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

1
Ciò consente anche di assegnare al valore un nome più semantico. en.wikipedia.org/wiki/…
Aaron J Lang

Questo è utile Se stai cercando di riempire una matrice di byte usando il metodo 'fill' di java, questo è molto sensato.

Il compilatore si è appena lamentato di quanto segue e ho dovuto aggiungere il cast: public static final byte BYTE_MASK = ( byte )0xff;
Marvo

E mi sono reso conto che in realtà volevo byte BYTE_MASK = 0x000000ff;che non ottenessi alcuni brutti bug di estensione dei segni.
Marvo,

5

Che ne dici di scavalcare il metodo con

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

questo consentirà f(0)


26
-1 Questo è molto male per la leggibilità del codice. E potrebbe causare problemi quando le persone cercano effettivamente di passare un valore superiore a quello che il byte può contenere. Scoraggio alle persone dall'uso di questo metodo!
Rolf ツ

3
Inoltre, questo cast avverrà in fase di esecuzione. Molto brutto.
BrainSlugs83,

Completamente d'accordo con Rolf (Tsu), vale forse la pena aggiungere, che tecnicamente è un sovraccarico, non un errore.
Cromax,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.