7

次のプログラムが例外をスローするのはなぜですか?

public class MainClass{
  public static void main(String[] argv){
       callMethod(2);
  }
  public static void callMethod(Integer... i){
       System.out.println("Wrapper");
  }
  public static void callMethod(int... i){
       System.out.println("Primitive");
  }

}

メソッド callMethod(Integer[]) は MainClass 型に対してあいまいです

OK、2 つのメソッドのどちらかが機能することはわかりますが (もう一方がコメントアウトされている場合)、プリミティブがメソッドの入力の型と正確に一致しない場合に何が起こるかについて階層があることも知っています。

最初に試みられることは、プリミティブを広げることです。したがって、3 番目の方法があった場合:

      public static void callMethod(long i){
       System.out.println("long");
      }

コードは長く印刷されます

2 つ目は、プリミティブをボックス化することです。したがって、整数を受け取るメソッドがあれば、それが呼び出されます。

3 番目の優先順位は var-args です。

上記の優先順位に基づいて、2番目の優先順位が当てはまると思います。int が Integer にラップされ、 (Integer...) が呼び出されることを期待します。しかし、もちろん、これは起こりません。代わりに、例外がスローされます。

この例で優先順位付けが適用されない理由を見て、説明できる人はいますか?

乾杯!

4

1 に答える 1

9

拡張がボクシングの前に来て、それが var-args の前に来るのは正しいです。

callMethod(Integer i)しかし、あなたは最初の方法をではなくとして扱っているようですcallMethod(Integer... i)。どちらの方法も var-args を使用するため、優先順位が 1 つあります。つまり、どちらもボックス化のみの基準を満たしていませんが、両方とも var-args の基準を満たしています。

拡大してからボックス化することは違法であることに注意してください(ただし、この回答を投稿する前に調査を行ったところ、ボックス化してから拡大することは合法であることがわかりました)。同様に、ボックス、次に var-args の動作は得られません。コンパイラは var-args ステップまでスキップし、var-args を取る 2 つのメソッドを確認します。

編集:あいまいさがなければ、 box-then-var-args の動作が得られることを明確にする必要があります。つまり、 が 1 つしかなくcallMethod()、 がかかるInteger... i場合、「Wrapper. 」が返されます。

于 2010-02-23T21:48:24.377 に答える