可変引数に適用されるJLS15.12を理解したと思ったとき、次の例を示します。
package com.example.test.reflect;
public class MethodResolutionTest2 {
public int compute(Object obj1, Object obj2) {
return 42;
}
public int compute(String s, Object... objects)
{
return 43;
}
public static void main(String[] args) {
MethodResolutionTest2 mrt2 = new MethodResolutionTest2();
System.out.println(mrt2.compute("hi", mrt2));
System.out.println(mrt2.compute("hi", new Object[]{mrt2}));
System.out.println(mrt2.compute("hi", new Object[]{mrt2, mrt2, mrt2}));
}
}
印刷する
42
43
43
私は最初の行を理解しています: JLS15.12は、メソッドの解決がフェーズで行われ、フェーズ 1 と 2 は可変引数メソッドを無視して互換性のあるメソッドがあるかどうかを調べ、フェーズ 3 (可変引数を含む) はフェーズ 1 と 2 が失敗した場合にのみ発生すると述べています。(JLSとこの SO の質問を参照してください。 ) したがって、該当compute(String s, Object... objects)
する場合は常に無視されcompute(Object obj1, Object obj2)
ます。
しかし、他の 2 行に 43 が表示される理由がわかりません。anObject[]
は an のインスタンスでもあるのにObject
、なぜ varargs メソッドと一致するのでしょうか?
編集:
...この
Object arg2 = new Object[]{mrt2};
System.out.println(mrt2.compute("hi", arg2));
印刷し42
ます。