public class aman {
    void m(double a , int b, int c) {
        System.out.println("second");
    }
    void m(float a , int b, double c) {
        System.out.println("first");
    }
    public static void main(String[] args) {
        aman obj = new aman();
        obj.m(23, 12, 1);
    }
}

Здесь метод m () был перегружен, но я не понимаю, почему вызов неоднозначен, потому что в первом методе требуется только одно преобразование, тогда как во втором методе требуется два преобразования. Итак, определенно нужно было вызвать первый метод. Укажите причину, по которой этого не происходит, или если я упустил какое-то правило.

7
Aman 10 Апр 2014 в 18:34

5 ответов

Лучший ответ

JLS не будет рассматривать 2 преобразования и 1 преобразование как разницу. Он будет различать только иметь возможность конвертировать и не иметь возможности конвертировать .

Поскольку оба метода have-to-convert , они одинаково возможны.

По этой теме существует мой ответ на аналогичный вопрос (но не совсем такой же).

11
Community 23 Май 2017 в 12:32

Здесь метод будет неоднозначным, поскольку вы заполняете все параметры как целые значения, тогда компилятор запутает (для автоматического приведения типа). поэтому вам нужно определить что-то вроде этого суффикса для вашего кода:

public class aman {
    void m(double a , int b, int c) {
        System.out.println("second");
    }
    void m(float a , int b, double c) {
        System.out.println("first");
    }
    public static void main(String[] args) {
        aman obj = new aman();

        obj.m(20d, 30, 40);//for calling first method 
        obj.m(23f, 12, 1d);//for calling second method.
    }
}
4
Raju Sharma 10 Апр 2014 в 14:52

Здесь возможно как продвижение, так и int to float до удвоения. поэтому компилятор не может принять решение, какой метод следует вызвать, поэтому во время выполнения выдает неоднозначную ошибку. Брешь в методе, отменяющая автоматическое продвижение шрифта.

0
Anuj Kumar Agarwal 19 Июл 2016 в 04:55
public class Test {

    void m(int c , int b, int d) {
        System.out.println("Automatic promotion in overloading--->"+c);

    }

    public static void main(String[] args) {
        Test obj = new Test();
            obj.m('A', 30, 40);
    }
}
-1
Linh 15 Фев 2017 в 06:12

Это неоднозначно, потому что вы вызываете его с помощью трех литералов Integer.

Вы должны использовать либо:

obj.m(23d, 12, 1);

Или

obj.m(23, 12, 1f);

Выявить, какой аргумент нужен как есть, и какой аргумент может быть приведен.

-2
ifloop 10 Апр 2014 в 14:43