読者です 読者をやめる 読者になる 読者になる

幸ログ

使命感に狩られないようにがんばります

Java メソッドの引数に関する暗黙の型変換について

Java

暗黙の型変換って響きがいいよね!!

暗黙の型変換って響きがいいし便利そうだけど、初見にはとても混乱するものですね。
Rubyをよく使っていましたが、暗黙の型変換は使った覚えがそこまでないですね…(無意識に使っているのか… はたまた自分のコーディング力がないのか…
ちなみにRubyではこんな感じで使われるらしいです。

www.techscore.com

さて本題

現在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