固定/可変アリティ(varargs)の両方の一致を備えた最も特定の方法
-
19-09-2019 - |
質問
の Java言語仕様のセクション15.12.2.5, 、それは固定されたアリティと可変arityの方法を持つ方法の両方の場合に最も具体的な方法を選択する方法について説明しています(すなわち varargs
).
JLSで見つからないのは、2つの方法を決定することについてのことです。 1つは固定された不安で、さまざまなアリティの1つです でも。例えば:
public interface SomeApi {
public String getSomething(String arg); // method 1
public String getSomething(String ... args); // method 2
}
予想されるようにうまくコンパイルされています(以下のヨニが概説した理由から)。この呼び出しコードもコンパイルします:
SomeApi api = ...
Object o = api.getSomething("Hello");
そして、あなたがそれを実行した場合、 method #1
(つまり、非バラルグ法)と呼ばれます。なぜこの呼び出しコードが曖昧ではないのですか?固定されたアリティメソッドが可変性のある方法よりも具体的なのはなぜですか?誰かが私に関連する仕様のビットを指すことができますか?
解決
最初のメソッド解像度フェーズでは、固定されたアリティメソッドのみを考慮し、VARARGSメソッドが考慮される前に一致が見つかった場合にプロセスが終了します。
から http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2.2
15.12.2.2フェーズ1:識別 一致するアリティ サブタイピングによって適用可能な方法
サブタイピングによって適用される方法が見つからない場合、適用される方法の検索はフェーズ2(§15.12.2.3)で続きます。 それ以外の場合、最も具体的な方法(§15.12.2.5)は、サブタイピングによって適用される方法から選択されます。
(私の強調。)
他のヒント
私はあなたに仕様を指摘することはできませんが、論理的には
getSomething(String...args)
に翻訳します
getSomething(String[] args)
あいまいさはありません