暗黙の型変換とは? | Java入門
暗黙の型変換って響きがいいよね!!
暗黙の型変換って響きがいいし便利そうだけど、初見にはとても混乱するものですね。
Rubyをよく使っていましたが、暗黙の型変換は使った覚えがそこまでないですね...(無意識に使っているのか... はたまた自分のコーディング力がないのか...
ちなみにRubyではこんな感じで使われるらしいです。
さて本題
現在Java Silverの取得に向けて勉強をしているのですが、暗黙の動きが多く頭の中で混乱を起こしたのでまとめていきます。
暗黙の型変換とは?
明示的に型を変換(キャスト)しなくても、代入、もしくは計算をしてくれます。
問題です
以下のプログラムでどのメソッドが呼び出されますか?
答えがわかる人はもうこのエントリーを見なくても大丈夫です 笑
正解は引数がlong型を受け取っていくれるmethodが呼び出されています。
なぜかと言いますと、暗黙の型変換が行われているためです。
int型の変数numは暗黙の型変換により、long型に変換されています。
じゃぁなぜshort型は呼び出されないのかというと暗黙の型変換がで行うことがでいないからです。
int → long ◯ int → short × ?
さて謎が深まりました。
なぜlong型には変換できたのに、short型には変換ができないのか?
まず暗黙の型変換にはルールがあり、型の領域を拡大させることのみが許可されています。
型の領域を拡大させるというものは小から大に変換ができます。
しかし型の領域を縮小させることはできません。
これらを踏まえてintとlongとshortを比較してみましょう。
- int 32ビット 符号つき整数,2147483648~2147483647
- long 64ビット 符号つき整数, 9223372036854775808~9223372036854775807
- short 16ビット符号つき整数,-32768~32767
昇順に並び変えると
short → int → long
となります。
ここでもう一度暗黙の型変換のルールを思い出してください。
暗黙の型変換は型の領域を拡大させることのみが許可されています。
intからlongに変換の流れを表現すると、 int(小) → long(大)という変換の流れができています。
次にintからshortに変換を表現すると int(大) → short(小)という変換の流れができます。
このことからintからshortに暗黙の型変換が行われません。
これらの内容を踏まえて、もう一度コードを見ると
暗黙の型変換が行なわれ、引数がlong型のmethodが動くということが納得してもらえると思います。
ただここで勘違いしてはいけないことは、intからshortに暗黙の型変換ができないだけで、
明示的にキャストをしてあげることが型の変換はできるということです。
なので気をつけてください。
余談
Streamがわからぬ...
なにあの暗号...
勉強していきます...
追記 2017/2/21
基本型の暗黙の型変換を以下の表でまとめました。
型名 | 暗黙の変換 | 変換できる型 |
---|---|---|
boolean | 不可 | 基本型の変換はできない |
byte | 可能 | short, int, long, float, double |
short | 可能 | int, long, float, double |
int | 可能 | long, float, double |
long | 可能 | float, double |
float | 可能 | double |
double | 不可 | 基本型の変換はできない |
char | 可能 | int, long, float, double |