質問: 'あ'; System.out.println(i); } } ``` --- ▼実行結果 ``` 12354 ```
回答: ニュアンスとしては、表現力の小さい型から、(それを包含する)表現力の大きい型へ変換する場合には問題が発生する要素がないので、特別な手続きなしに暗黙的に変換してくれる、という考え方になります。 今回の件で言うと、`'あ'`は`char`型、`i`は`int`型です。 `char`で表現できる数値は全て`int`も表現可能なのでプログラマに意識させずにJavaが変換してくれています。 `あ`のUTF-16コードは次のPDFに記載されている通り16進数で`3042`ですが、これを10進数に直すと`12354`となります。 * 仕様を参照して説明すると: `'あ'`は文字リテラルです。これはJavaでは`char`型になります(3.10.4. Character Literals)。 `char`から`int`の型変換は**widening primitive conversions**(5.1.2. Widening Primitive Conversion)です。 そして、代入時には右辺の式の型を左辺の変数の型に変換する必要があります(5.2. Assignment Contexts)が、ここでは上記のwidening primitive conversionが許容されています。 したがって、 > > int i = 'あ'; > > > はJavaとして妥当で、前述の5.1.2節の通り精度を保ったまま`char`から`int`へ変換されます。 Daichi Itokazuさんの回答は、若干正確さを欠いています。 > > このプリミティブ型ではビット数の多い型への代入は言語仕様として、暗黙的に変換されるようになっています。 > > > `float`は32ビット、`long`は64ビットのプリミティブ型ですが(Primitive Data Types)、`float`から`long`はnarrowing変換であり、代入時の変換として許されていません。(明示的なキャストが必要)(浮動小数と整数)。 また、`byte`は8ビット、`char`は16ビットのプリミティブ型ですが、`byte`から`char`の変換はwidening and narrowing primitive conversionであり、これも代入時に許されている変換ではありません(いわゆる`signed`と`unsigned`)。 版は少し古いようですが、JLSを和訳されている方がいらっしゃいましたので付記します。 * Java言語規定 変換及び昇格