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