10

次のように 2 つの varargs メソッドだけを宣言するとします。

public void foo(String... strings) {
    System.out.println("Foo with Strings");
}

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

そしてコードを持っています:

foo();

これは、予想どおりのあいまいさによるコンパイラ エラーです。

ただし、次の 2 つのバージョンの foo しかない場合:

public void foo(Object... objects) {
    System.out.println("Foo with Objects");
}

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

次にコード

foo();

メソッドの ints バージョンを呼び出します。2 番目の例が同様に曖昧ではない理由と、Object メソッドではなく int メソッドに解決される理由を誰でも説明できますか。ありがとう。

4

2 に答える 2

29

scjp を準備していたときのことを正しく思い出せば、最初のケースでは、2 つの引数があり、それらの間に関係がないため、コンパイラは 1 つを選択できません。

2 つ目は、ボックス化が有効になっている場合 (1.5 以降)、int は Object のサブセットである Integer にすることができ、競合が発生した場合、コンパイラは常に最も具体的な定義を使用します。なので整数(int)が優先されます。

于 2009-06-04T15:49:34.767 に答える
4

Java は可能な限り最も近い型を常に使用するため、メソッドに int を渡すと、int... メソッドがなければ、それらは Integers に自動ボックス化され、Object... が使用されます。 .. メソッド、Java は最初にそれを使用します。これは、Java コンパイラの設計における選択です。

于 2009-06-04T15:50:42.817 に答える