はじめに
Java SE8 Silverの問題集を読んでいたら、「char型は暗黙的にint型やdouble型にキャストできる」と書かれていました。
恥ずかしながら、業務で何年もJavaを使っていましたが、この事実を全く知りませんでした。
そこで、「なぜchar型がint型やdouble型にキャストできるのか?」という理由を調べようと思ったのですが、問題集の中にはその理由が書かれていなかったので、私なりに調べた結果をまとめてみました。
※誤っている記述等がありましたら、ご指摘頂けると幸いです。
調査に使ったコード
TypeCast.java
public class TypeCast {
public static void main(String[] args) {
char ch = '1';
// 暗黙的にint型、double型にキャストする。
int i = ch;
double d = ch;
System.out.println(ch + "をint型にキャストした結果: " + i);
System.out.println(ch + "をdouble型にキャストした結果: " + d);
// 引数がdouble型のメソッドに対して、char型を引数として渡す。
foo(ch);
}
static void foo(double d) {
System.out.println("double型: " + d);
}
}
出力結果
- 何のエラーもなく、コンパイルして実行できました。
- ですが、char型の「1」をint型にキャストすると、なぜか「49」になってしまいます。
1をint型にキャストした結果: 49
1をdouble型にキャストした結果: 49.0
double型: 49.0
char型の「1」をint型にキャストすると「49」になる理由
char型のラッパークラスであるCharacter型のAPIを見ると、「Unicode文字表現」と書かれています。
そこで「1」をUnicodeの表で見ると、「U+0031」という値で表されていることが分かります。
Unicodeの表の値は16進法であり、実際には「0x31」となっているため、これを10進法に改めると「49」となります。
つまり、char型の「1」が暗黙的にint型にキャストされた場合、この「49」がint型の変数に格納されていることになります。
まとめ
- char型は「文字のデータ型」という認識だったので、int型やdouble型にキャストできることに驚きましたが、理由を調べて何となく腑に落ちました。
- 資格試験の勉強をすると、「普段は業務で使わない部分」まで学習する必要があるので、試験の合否に関わらず自身の知識レベルを知る良い機会になります。