オートボクシング/拡大は短いa = 3で発生しますが、フロートa = 3では発生しません。
-
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;