5
class Dec26 {
    public static void main(String[] args) {
        short a1 = 6;
    new Dec26().go(a1);
    new Dec26().go(new Integer(7));
 }
 void go(Short x) { System.out.print("S "); }
 void go(Long x) { System.out.print("L "); }
 void go(int x) { System.out.print("i "); }
 void go(Number n) { System.out.print("N "); }
 }

出力:

i N

上記の例では、コンパイラが整数のボックスを解除してintオプションを選択する代わりに、拡大オプション(つまり、整数->数値)を選択するのはなぜですか?

ありがとう

4

2 に答える 2

6

あなたの質問は、一般的な変換の優先順位についてではなく、過負荷解決アルゴリズムの詳細についてです。

下位互換性の理由から、過負荷解決のプロセスは3つのフェーズで構成されます。

  • フェーズ1:サブタイピングによって適用可能な一致するアリティメソッドを特定する
    • varargsとboxing/unboxingを無視します
  • フェーズ2:メソッド呼び出し変換によって適用可能な一致するアリティメソッドを特定する
    • varargsを無視しますが、ボクシング/アンボクシングを尊重します
  • フェーズ3:適用可能な可変アリティメソッドを特定する
    • 可能なすべての変換をサポートします

コンパイラーは、あるフェーズで潜在的に適用可能なメソッドを識別できない場合、次のフェーズに進みます。逆に、コンパイラーは潜在的に適用可能なメソッドを分析して最も具体的なメソッドを選択し、それを呼び出しに使用します。

ご覧のとおり、あなたの場合、両方の呼び出しはサブタイピング(shortのサブタイプ、intはのIntegerサブタイプ)によって適用可能Numberであるため、フェーズ1で解決されるため、過負荷解決プロセスがフェーズ2に到達することはなく、可能なアンボックス化は無視されます。

参照:

于 2012-01-02T15:13:22.793 に答える
0

オブジェクトはプリミティブ型よりも優先されると思います。

于 2012-01-02T14:56:16.193 に答える