char
Java では16 ビットの符号なしの値ですbyte
が、 8 ビットの符号付きの値です。バイトの許容範囲は です[-128, 127]
。したがって、すべての文字を に割り当てることはできませんbyte
。
最初のメソッドでは、コード ポイント = 1 ( ) の achar
を返しています。として定義し、それに定数式を代入したので、コンパイル時定数になります。したがって、コンパイラはコンパイラエラーを出しません。'b' - 'a'
char
final
JLSセクション5.2から:
式が byte、short、char、または int 型の定数式 (§15.28) である場合:
- 変数の型が byte、short、または char であり、定数の値が式は変数の型で表現できます。
鉱山を強調します。
ただし、c
non-final にすると、コンパイル エラーも発生します。
static byte m1() { // This will be an error
char c = 'b'-'a';
return c;
}
その理由は、c
もはやコンパイル時の定数ではなく、コンパイラが暗黙的なダウンキャストを行わないためです。
char
2 番目のメソッドでは、渡した を返します。そこのパラメータc
はコンパイル時定数ではありません。メソッドが取得する可能性のある値は、コンパイル時にはわかりません。同様に、char
許可された値の範囲外のコード ポイントで a を渡すと、機能しbyte
ません。
2 番目の方法を機能させるには、明示的なキャストを行うことができます。
static byte m3(final char c) {
return (byte)c; // 3
}