コンパイラの特定の機能が私を困惑させます (Eclipse を使用する Oracle JDK 1.7)。
したがって、char プリミティブは明示的に short と byte にキャストする必要があると書かれているこの本を持っていますが、データ型の許容範囲が重複しないため、これはすべて理にかなっています。
つまり、以下のコードは機能します (ただし、明示的な型キャストがないと機能しません)。
char c = '&';
byte b = (byte)c;
short s = (short)c;
b または s を印刷すると、数値 38 が正しく表示されます。これは、Unicode の (&) に相当する数値です。
それが私の実際の質問につながります。以下も同様に機能するのはなぜですか?
byte bc = '&';
short sc = '&';
System.out.println(bc); // Correctly displays number 38 on the console
System.out.println(sc); // Correctly displays number 38 on the console
今、私は確かに次のことを理解しています(これも機能します):
byte bt = (byte)'&';
System.out.println(bt); // Correctly displays number 38 on the console
しかし、このコンパイラ警告なしの文字からバイト (および短い) への「こっそり変換」は、私には正しくないようです。
なぜこれが許可されているのか、誰か説明できますか?
理由は'<char>'
それ自体の解釈にある可能性があるため、実際には char プリミティブ状態にはなりませんが、数値 (8 進数または 16 進数など) 値として処理されますか?