Java: разрешение перегруженного метода и varargs - запутанный пример - PullRequest
13 голосов
/ 17 мая 2011

Когда я подумал, что понял 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

Iпонять первую строку: 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?


edit:

... и это

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

отпечатки 42.

Ответы [ 2 ]

9 голосов
/ 17 мая 2011

В секции 8.4.1 :

Если последний формальный параметр является параметром переменной arity типа T, считается, что он определяет формальный параметр типаT[].

Поскольку вы явно предоставляете массив, это позволяет вторым двум вызовам соответствовать методу переменной арности на первом этапе, без учета переменной арности.

4 голосов
/ 17 мая 2011

Методы Vararg могут вызываться с несколькими параметрами (a, b, c) или в виде массива ({a, b, c}).Поскольку вы передаете массив, соответствующий типу переменных, он имеет приоритет.

Ссылка: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...