java が拡大してからオートボクシングを行わない理由がわかりません。
Integer i = (short) 10;
私は次のことが起こると思います:
10
最初に からへの変換を絞り込みshort
ます。short
に広がりint
ます。int
にオートボックスしInteger
ます。
代わりに、コンパイルエラーです。
例 2:
ショート x = 10;
整数 y = x;
これも失敗。
java が拡大してからオートボクシングを行わない理由がわかりません。
Integer i = (short) 10;
私は次のことが起こると思います:
10
最初に からへの変換を絞り込みshort
ます。short
に広がりint
ます。int
にオートボックスしInteger
ます。代わりに、コンパイルエラーです。
例 2:
ショート x = 10;
整数 y = x;
これも失敗。
割り当て変換を扱うJLS のセクション 5.2によると、次のようになります。
割り当てコンテキストでは、次のいずれかを使用できます。
恒等変換 (§5.1.1)
拡張プリミティブ変換 (§5.1.2)
拡大参照変換 (§5.1.5)
ボックス化変換 (§5.1.7) に続いて、オプションで拡大参照変換
ボックス化解除変換 (§5.1.8) の後に、必要に応じて拡張プリミティブ変換が続きます。
一度に 2 つの変換を適用することはできません (拡張プリミティブ変換とボックス化変換)。ここでは 1 つの変換しか適用できないため、エラーが発生する必要があります。
解決策は、short
バックを an int
(キャスト変換) にキャストすることです。これにより、代入変換をボクシング変換にすることができます。
Integer i = (int) (short) 10;
(またはここでは、そもそもキャストしないでくださいshort
。)
Integer i = 10;
ここで行われているのは、 から へのキャスト変換と、 からint
へのshort
代入変換の試行です。short
Integer
代入変換 ( §5.2 ) は、ボックス化してから拡大することはできますが、拡大してからボックス化することはできません。
割り当てコンテキストでは、次のいずれかを使用できます。
恒等変換 (§5.1.1)
拡張プリミティブ変換 (§5.1.2)
拡大参照変換 (§5.1.5)
ボックス化変換 (§5.1.7) に続いて、オプションで拡大参照変換
ボックス化解除変換 (§5.1.8) の後に、必要に応じて拡張プリミティブ変換が続きます。
オートボクシングとワイドニングに関するオーバーロードを使用して、同様のユース ケースをシミュレートできます。
public static void m(short s) {
System.out.println("widening");
}
public static void m(Integer i) {
System.out.println("Autoboxing");
}
public static void main(String[] args) {
short x = 10;
m(x);
}
出力:拡大
したがって、一言で言えば、ワイドニングはJavaのオートボクシングを支配します