10

オートボクシングを理解しようとしているだけです。これは、1つのこととは別に行います。

Short s = 250;
Long l = 250;

の割り当てはLong l失敗します。これは、ボックスを拡大できないためです(つまり、int250をaに拡大してからlong、ボックス化しようとしますが、ボックス化できません)。

ただし、への割り当ては機能しShort sます。これをうまくするために何が起こっているのですか?私の仮定はそれがまだボクシングとある種の変換をしているということでした。しかし、それがに250適合することを知っている場合short、なぜそれ250がに適合するかを知らないのlongですか?

4

2 に答える 2

15

通常、割り当てに複数の(暗黙の)変換を適用することはできません(JLS§5.2割り当て変換):

代入変換は、式の値が変数に割り当てられたときに発生します(§15.26)。式の型を変数の型に変換する必要があります。割り当てコンテキストでは、次のいずれかを使用できます。

  • ID変換(§5.1.1)
  • 拡大するプリミティブ変換(§5.1.2)
  • 拡大参照変換(§5.1.5)
  • ボクシングの変換(§5.1.7)とそれに続く拡張参照変換
  • 開開変換(§5.1.8)の後に、オプションで拡張プリミティブ変換が続きます。

Long l=250;2つの変換(プリミティブ変換の拡大とそれに続くボクシング変換)が必要なため、コンパイルされません。

Long l=250l;単一のボクシング変換が必要なため、コンパイルします。

ただし、定数式の変換を絞り込むことは特殊なケースであるため、Short s=250;コンパイルは次のようになります。

さらに、式がbyte、short、char、またはint型の定数式(§15.28)の場合:

  • 変数の型がbyte、short、またはcharであり、定数式の値が変数の型で表現できる場合は、ナローイングプリミティブ変換を使用できます。
  • 変数のタイプが次の場合は、ナローイングプリミティブ変換とそれに続くボクシング変換を使用できます。
    • バイトと定数式の値は、バイト型で表すことができます。
    • Shortであり、定数式の値はshort型で表すことができます。
    • 文字と定数式の値は、char型で表すことができます。
于 2013-01-20T14:58:49.017 に答える
0

理想的には、自動ナローイングは許可されるべきではありません。

しかし、バイト/ショートリテラルがないため、書き込むことができません

byte b = 0b;

そしてそれはばかげているようです

byte b = (byte)0;

したがって、定数整数の自動ナローイングが許可されているため、次のように記述できます。

byte b = 0;

これはオートボクシングケースに引き継がれます。

long / Longの場合、長いリテラルがあるため、これはそれほど問題にはなりません。それでも、符号付き整数の自動拡張は常に安全であるため、許可する必要があります。

于 2013-01-20T16:17:57.783 に答える