2017-11-30 31 views
0

デフォルトでは、Javaはリテラルでint値を定義しているとみなします。リテラルで暗黙の変換

short x = 20; // There is an implicit conversion 

しかし、我々はeampleため、算術式に変数を「×」を使用します。

short y = x * 2; //DOES NOT COMPILE 

私たちは、20 * 2の結果を簡単に短い変数に収まることができる40、知っているが。 何が起こっていますか?

答えて

5

それをキャストする必要がありポイントは:

short y = x * 2; 

コンパイラは、最終的な変数xがその時点までに変更されている可能性があることを単純に考えます。したがって、それは単に20として扱われません。 xをfinalとして定義すると、暗黙の会話は機能します:

final short x = 20; // There is an implicit conversion 
short y = x * 2; //DOES COMPILE 
0

私はコンパイラの実装の詳細を知らない。私は、コンパイル時にxの値がわからない可能性があるため、コンパイラがチェックする方法がないという理由があると思います。したがって、それはintであると仮定することしかできません。そうでなければ、コンパイラがどのように動作すると思いますか?

あなたは*演算子プロトタイプ、 参照見れば:https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/voe/lecture.html

(int型、int型)1つだけがありますので、技術的に(ショートショート)のための1がありません。

だから、x = 20の短い作品はなぜですか?あなたがshort x =20を書くとき Java - short and casting

0

: 理由は、それが、この場合、最終的なものである「20」、定数の場合、X * 2が最終 見えないですしながら、Javaが短いに自動キャストを許可することができていますJavaは正常にコンパイルしていますがshort y=x *2を書くとき、それはint型として扱われ、xは、変数がまだ20のprogrammが到達することになるという保証はありません最終的ではありませんので、あなたのような短いにshort y =(short)x*2

0

あなたは(あなたがxfinalをしたくない場合)yに算術演算の結果を割り当てるためにキャスト使用して、次の表記法を使用することができます。

short y = (short)(x * 2); 

私は答えがJava言語仕様にあると思います。ポイント4.2.2を見てください。int型またはlong型の値を返す数値演算子のリストがあります。これがjavaがint型として扱い、キャストが必要な理由です: https://docs.oracle.com/javase/specs/jls/se9/html/jls-4.html#jls-4.2.2