char
in Java è un unsigned valore 16 bit, mentre byte
è 8 bit firmato valore. L'intervallo consentito per il byte è [-128, 127]
. Quindi, non tutti i caratteri possono essere assegnati in byte
.
Nel tuo primo metodo, si restituisce un char
con punto codice = 1 ('b' - 'a'
). Da quando hai definito char
come final
e assegnandogli un'espressione costante, diventa una costante di tempo di compilazione. Quindi, il compilatore non fornisce alcun errore del compilatore.
Da JLS Section 5.2:
If the expression is a constant expression (§15.28) of type byte, short, char, or int:
- A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
enfasi è mia.
Tuttavia, se si fanno c
non finale, sarà anche tradursi in un errore di compilazione:
static byte m1() { // This will be an error
char c = 'b'-'a';
return c;
}
La ragione è, c
non è un tempo di compilazione costante più, ed il compilatore non fa un implicito downcast.
Nel secondo metodo si restituisce il char
passato. Il parametro c
non ha una costante di tempo di compilazione. Non è noto al momento della compilazione quale valore potrebbe ottenere il metodo. Come, se si passa un char
con punti di codice non nell'intervallo consentito di valore byte
, non funzionerà.
per rendere il secondo metodo di lavoro, si può fare un cast esplicito:
static byte m3(final char c) {
return (byte)c; // 3
}
Cosa intendi per non lavorare? –
durante la compilazione dice: errore: possibile perdita di precisione – chathura
Forse ottimizzazione statica nel metodo 1? –