Метод неоднозначен для типа Ошибка

Я пытаюсь понять, как работает Перегрузка в JAVA, и пытаюсь понять различные правила перегрузки, которые применяются в случае расширения, автобоксирования и varargs в JAVA. Я не могу понять, что происходит в следующем сценарии:

 package package1;

 public class JustAClass {
     public static void add(int a, long b) {
         System.out.println("all primitives");
     }

   //public static void add(Integer a, long b) {
   //     System.out.println("Wraper int, primitive long");
   //}

     public static void add(int a, Long b) {
         System.out.println("Primitive int, Wrapper long");
     }

     public static void add(Integer a, Long b){
         System.out.println("All wrapper");
     }

     public static void main(String[] args) {
        int a = 10;
        Integer b = 10;
        long c = 9;
        Long d = 9l;

        add(a,c);
        add(a,d);
        add(b,c);
        add(b,d);
 }

}

На этом этапе я получаю ошибку компиляции при третьем вызове add метод высказывания The method is ambiguous for the type Error, Почему это так? Каковы правила для определения, какой вызов метода будет работать? Что именно происходит в следующем случае? я так чувствую fourth перегруженный метод add должен работать. Пожалуйста, помогите мне понять концепцию этого.

1 ответ

Решение

Существует 3 этапа разрешения перегрузки метода. На первом этапе не выполняется автобокс / распаковка, что означает методы, которые требуют упаковки / распаковки переданных параметров, чтобы соответствовать одной из перегруженных версий add будет рассматриваться только в том случае, если не найдено совпадений, не требующих упаковки / распаковки. Вот почему 3 ваших звонка, которые имеют одно точное соответствие, работают. относительно add(b,c);см. ниже, почему это неоднозначно.

   add(a,c); // exact match to add(int a, long b)
   add(a,d); // exact match to add(int a, Long b)
   add(b,c); // there is no exact match, so at least one of the passed parameters must
             // be boxed or unboxed. However, by unboxing b to int or boxing 
             // c to Long, each of the three add methods can match, and the 
             // compiler doesn't know which one to prefer
   add(b,d); // exact match to add(Integer a, Long b)
Другие вопросы по тегам