4

java が拡大してからオートボクシングを行わない理由がわかりません。

Integer i = (short) 10;

私は次のことが起こると思います:

  1. 10最初に からへの変換を絞り込みshortます。
  2. shortに広がりintます。
  3. intにオートボックスしIntegerます。

代わりに、コンパイルエラーです。

例 2:

ショート x = 10;
整数 y = x;

これも失敗。

4

4 に答える 4

6

割り当て変換を扱う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;
于 2013-07-29T23:32:32.867 に答える
3

ここで行われているのは、 から へのキャスト変換と、 からintへのshort代入変換の試行です。shortInteger

代入変換 ( §5.2 ) は、ボックス化してから拡大することはできますが、拡大してからボックス化することはできません。

割り当てコンテキストでは、次のいずれかを使用できます。

  • 恒等変換 (§5.1.1)

  • 拡張プリミティブ変換 (§5.1.2)

  • 拡大参照変換 (§5.1.5)

  • ボックス化変換 (§5.1.7) に続いて、オプションで拡大参照変換

  • ボックス化解除変換 (§5.1.8) の後に、必要に応じて拡張プリミティブ変換が続きます。

于 2013-07-29T23:32:21.457 に答える
0

オートボクシングとワイドニングに関するオーバーロードを使用して、同様のユース ケースをシミュレートできます。

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のオートボクシングを支配します

于 2020-02-02T09:58:03.340 に答える