Которые получат предпочтения при вызове метода с параметром as (int, int), Method с подписью (int, int) или (Integer, Integer) - PullRequest
0 голосов
/ 02 июля 2018

У меня есть вызов метода с передачей параметров как (4,5).

У меня есть два метода с параметрами:

method1(int a, int b);
method1(Integer a, Integer b);

какой метод будет вызван и почему?

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Это было указано в Спецификация языка Java®, §15.12.2. Шаг 2 времени компиляции: определение сигнатуры метода :

...

Остальная часть процесса разделена на три этапа, чтобы обеспечить совместимость с версиями языка программирования Java до Java SE 5.0. Фазы:

  1. На первом этапе ( §15.12.2.2 ) выполняется разрешение перегрузки без разрешения преобразования в бокс или распаковку или использования вызова метода переменной арности. Если на этом этапе не найдено подходящего метода, обработка продолжается до второго этапа.
    ...
  2. Второй этап ( §15.12.2.3 ) выполняет разрешение перегрузки, в то же время позволяя упаковывать и распаковывать, но все же исключает использование вызова метода переменной арности. Если на этом этапе не найдено подходящего метода, обработка продолжается до третьего этапа.
    ...
  3. Третья фаза ( §15.12.2.4 ) позволяет сочетать перегрузку с методами переменной арности, упаковкой и распаковкой.

Поэтому, так как method1(int a, int b) найден на первом этапе, он будет использоваться. method1(Integer a, Integer b) будет найдено только на втором этапе, если на первом этапе не найден метод сопоставления.

0 голосов
/ 02 июля 2018

Ответы @Eran и @Holger верны и очень хорошо объяснены, но если вы хотите попробовать свой код самостоятельно, вот оно:

public class Answer {

    static void method1(int a, int b) {
        System.out.println("Inside the method1(int, int)");
    }

    static void method1(Integer a, Integer b) {
        System.out.println("Inside the method1(Integer, Integer)");
    }

    //Test
    public static void main(String[] args) {
        method1(4, 5);
        method1(Integer.valueOf(4), Integer.valueOf(5));

    //  method1(4, Integer.valueOf(5)); //Ambiguous method call - won't compile

    }
}

Вывод: Inside the method1(int, int) Inside the method1(Integer, Integer)

0 голосов
/ 02 июля 2018

4 и 5 являются литералами int. Поэтому они соответствуют вашему method1(int a, int b) без какого-либо преобразования. Поэтому будет выбрано method1(int a, int b).

Чтобы выбрать method1(Integer a, Integer b), компилятор должен будет поместить два литерала int в Integer с. Это может иметь место только в том случае, если не найден метод, соответствующий имени вашего метода и переданным параметрам, которые не требуют преобразования в бокс / распаковку. Очевидно, что это не так, поскольку method1(int a, int b) существует. Даже method1(long a, int b) или method1(long a, long b) или method1(int a, long b) предпочтительнее, чем method1(Integer a, Integer b), поскольку они не требуют преобразования в бокс.

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