オートボクシング/拡大は短いa = 3で発生しますが、フロートa = 3では発生しません。

StackOverflow https://stackoverflow.com/questions/3676629

  •  01-10-2019
  •  | 
  •  

質問

次のコードが機能しないことを理解しています

Float a=3

フロートa = integer.valueof(3)として翻訳されているためです。 LHSにフロートリファレンスとRHSに整数オブジェクトがありますが、これは互換性がありません。だが :

1.

     `Short a=3;`

これは機能しますが、ここでも機能しますが、LHSとRHSの整数オブジェクトを簡単に参照します。

2.

Float a=(Float) 3

タイプキャストしていなかった場合、それはinteger.valueof(3)として翻訳されていたでしょう。さて、それはfloat.valueof(3)として翻訳されますか?

役に立ちましたか?

解決

値よりも大きい値で変数を初期化しようとすると(値の数値形式に関係なく)、コンパイラはエラーメッセージを提供します。

char c = 0xffff; // max char hex value
byte b = 0x7f; // max byte hex value
short s = 0x7fff; // max short hex value

上記のコードでは、char、byte、およびshortの最大可能な16進数に注意してください。これらを超えると、コンパイラは自動的に値をintにし、割り当てに狭窄キャストが必要であることを伝えます。あなたはあなたがラインを踏んだことを知っているでしょう。

だからあなたの場合 Short s = 3 実際にはなります Short s = new Short(3) と機能します。 (Modern IDEがこれらの自動ボクシングにエラーとしてフラグを立てるオプションがあるのは、自動ボクシングの場合はValueofメソッドは使用されません。

2番目のケースで Float a=(Float) 3 となります Float.valueOf(3)

他のヒント

あなたの質問が「なぜフロートf = 3、コンパイルしないのではなく、短いs = 3、行う?」である場合、答えは次のとおりです。

Javaコンパイラは、整数定数でいくつかの特別な作業を行い、左側に適合します。最も適切なタイプを見つけて使用します。それで、

Short s = 3;

にコンパイルされます

Short s = Short.valueOf(3);

本質的に、あなたが書くときに同じ魔法が起こります

short s = 3;

ただし、これは整数に対してのみ行われ、浮動小数点値に対しては行われません。

短い形式は次のとおりです。

Float a=3.0f;

ダブルタイプの場合:

Double b=3.0;

短い定数とバイト定数を指定する方法はないため、コンパイラを使用すると、INT定数を透過的に翻訳できます。 Javaにはフロート定数があるため、暗黙の翻訳をサポートしていません。フロート/フロートが必要な場合は、フロート定数を使用することをお勧めします。

Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top