Перегрузка методов, продвижение типов JAVA

192
25 августа 2018, 02:10

Рассмотрим следующий код:

public class OverloadTest {
    void print(Integer i){
        System.out.println("Integer");
    }
    void print(long i){
        System.out.println("long");
    }
    public static void main(String[] args) {
        OverloadTest overloadTest = new OverloadTest();
        overloadTest.print(3);
    }
}

Будет вызван метод, принимающий тип long, т.к. продвижение типов следующее:

int > long > float > double > Integer > Number > Object

Рассмотрим тот же самый пример, только в качестве параметра передадим массив переменной длины того же типа:

public class OverloadTest {
    void print(Integer...i){
        System.out.println("Integer");
    }
    void print(long...i){
        System.out.println("long");
    }
    public static void main(String[] args) {
        OverloadTest overloadTest = new OverloadTest();
        overloadTest.print(3);
    }
}

Данный код завершится ошибкой времени выполнения:

Error:(11, 21) java: reference to print is ambiguous
both method print(java.lang.Integer...) in OverloadTest and method print(long...) in OverloadTest match

Почему теперь вызов неоднозначен и правила продвижения типов для массива переменной длины не работают?

Answer 1

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

READ ALSO
Android studio - Движение клавиатуры вместе с edittext

Android studio - Движение клавиатуры вместе с edittext

У меня есть EditText большой длины (около 100 строк), мне надо сделать так, чтобы при нажатии на нужную строку она двигалась так, чтобы она была видна...

170
Кеширование строки в Андроид

Кеширование строки в Андроид

Всем приветС сервера приходит json с данными

166
Хеш ветки или хеш коммита

Хеш ветки или хеш коммита

Столкнулся с задачей вывода текущей версии приложения, расположенного в репозитории gitСовпадает ли хеш ветки master с хешем последнего коммита...

178
Как создать проект на React Native?

Как создать проект на React Native?

После команды create-react-app MyApp командная строка пишет, что 'command not found', хотя должен запуститься процесс создания приложения на React

249