Просто, когда я подумал, что я понял JLS15.12, как это применимо к varargs, вот этот пример:
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 игнорируют методы varargs, чтобы узнать если существует совместимый метод, с фазой 3 (включая varargs), происходящий только в случае сбоев фаз 1 и 2. (См. JLS и этот вопрос SO.) Таким образом, compute(String s, Object... objects)
всегда игнорируется, если применяется compute(Object obj1, Object obj2)
.
Но я не понимаю, почему 43 печатается для двух других строк. Object[]
также является экземпляром Object
, так почему он соответствует методу varargs?
изменить:
... и этот
Object arg2 = new Object[]{mrt2};
System.out.println(mrt2.compute("hi", arg2));
выводит 42
.