4

Java 言語仕様のセクション 15.12.2.5 では、固定アリティのメソッドと可変アリティのメソッド (つまり ) の両方の場合で最も具体的なメソッドを選択する方法について説明していますvarargs

JLS で見つけられないのは、1 つは固定アリティで、もう 1 つは可変アリティの2 つの方法の間で決定することです。例えば:

public interface SomeApi {
    public String getSomething(String arg);       // method 1
    public String getSomething(String ... args);  // method 2
}

期待どおりにコンパイルされます (以下に Yoni が概説する理由によります)。この呼び出しコードは以下もコンパイルします。

SomeApi api = ...
Object o = api.getSomething("Hello");

それを実行すると、method #1(つまり、非可変引数メソッド) が呼び出されます。この呼び出しコードがあいまいではないのはなぜですか? 固定アリティ方式が可変アリティ方式よりも具体的なのはなぜですか? 誰かが仕様の関連するビットを教えてもらえますか?

4

2 に答える 2

10

最初のメソッド解決フェーズでは、固定アリティ メソッドのみが考慮され、一致が見つかった場合は、varargs メソッドが考慮される前にプロセスが終了します。

http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2から

15.12.2.2 フェーズ1: サブタイプによって適用可能なマッチング・アリティ・メソッドの識別

サブタイプによって適用可能なメソッドが見つからない場合、適用可能なメソッドの検索はフェーズ 2 (§15.12.2.3) に進みます。それ以外の場合は、サブタイプによって適用可能なメソッドの中から最も具体的なメソッド (§15.12.2.5) が選択されます。

(私の強調。)

于 2009-08-24T11:32:48.450 に答える
-1

仕様を示すことはできませんが、論理的には

getSomething(String...args) 

に変換します

getSomething(String[] args)

あいまいさなしに

于 2009-08-24T10:51:02.217 に答える