Метод перегрузки неоднозначный - PullRequest
0 голосов
/ 01 октября 2018

В настоящее время я рассматриваю экзамен OCA, и думал, что метод int / float будет работать для третьего теста.

В руководстве по изучению ОСА Джин Боярски говорит только 4 правила заказа, чтобы выбрать правильный перегруженный метод.

  1. Точное совпадение по типу
  2. Большой тип примитива
  3. Тип автобокса
  4. Varargs

Может кто-нибудь объяснить, почему Javaговорит, что это неоднозначно?

public static void main(String... args){
    OverLoadingMethod ov=new OverLoadingMethod();
    ov.test(1F,2);
    ov.test(1,2F);
    ov.test(1,2);
}
public void test(float i,int j){
    System.out.println("float/int");        
}

public void test(int i,float j){
    System.out.println("int/float"); 
}
public void test(float i,float j){
    System.out.println("float/float");
}

выдает эту ошибку

OverLoadingMethod.java:12: error: reference to test is ambiguous
        ov.test(1,2);
          ^
  both method test(float,int) in OverLoadingMethod and method test(int,float) in OverLoadingMethod match

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Java автоматически преобразует int в float, так как нет потери точности.

Таким образом, ваш test(1,2) можно интерпретировать как два аргумента с плавающей точкой, один с плавающей точкой - один с int и один с int - один с плавающей точкой.Таким образом, это неоднозначно для компилятора.

0 голосов
/ 01 октября 2018

Для ov.test(1,2), оба test(int i,float j) и test(float i,int j) доступны и применимы.Затем компилятору нужно выбрать наиболее конкретный, в то время как любой из них недостаточно конкретен, поэтому возникает ошибка компилятора.

Вся процедура полного выбора описана в спецификации языка Java 15.12.2.5.Выбор наиболее специфического метода

0 голосов
/ 01 октября 2018

Ни одна из перегрузок не принимает два целых числа.

Итак, один из целых должен быть расширен до поплавка.Но какой?Перегрузка существует, когда float является первым параметром, а другая перегрузка существует, когда float является вторым параметром.

Что следует выбрать?Что объективно лучше 1006 *?Ни один, согласно правилам, не спецификация языка.Отсюда и неоднозначность.

...