Java: разрешение перегруженных методов и varargs - запутанный пример

Как раз когда я подумал, что понял 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) всегда игнорируется, если вычисляет (Object obj1, Object obj2) .

Но я не понимаю, почему 43 печатается для двух других строк. Object [] также является экземпляром Object , так почему он соответствует методу varargs?


edit:

... и это

Object arg2 = new Object[]{mrt2};
System.out.println(mrt2.compute("hi", arg2));   

печатает 42 .

13
задан Community 23 May 2017 в 12:25
поделиться