Рассмотрим следующий код:
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
Почему теперь вызов неоднозначен и правила продвижения типов для массива переменной длины не работают?
Перечисляемый тип не указан в списке продвижения, поэтому компилятор определяет, что оба метода подходят для вызова и выдает ошибку.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости