13

可変引数に適用される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ます。

4

2 に答える 2

9

セクション8.4.1 :

最後の仮パラメーターが 型の可変アリティ パラメーターである場合、型Tの仮パラメーターを定義すると見なされますT[]

配列を明示的に提供しているため、これにより、可変アリティを考慮せずに、最初のフェーズで 2 番目の 2 つの呼び出しを可変アリティ メソッドと一致させることができます。

于 2011-05-17T15:22:43.653 に答える
4

Vararg メソッドは、複数のパラメーター (a、b、c) または配列 ({a、b、c}) で呼び出すことができます。varargs の型と一致する配列を渡しているため、それが優先されます。

参照: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.1

于 2011-05-17T15:10:23.277 に答える