#java #overloading #type-promotion
Вопрос:
В первом фрагменте кода байт получает тип, повышенный до целочисленного типа
public class Main
{
Main(int a,byte b){
System.out.println("int 1");
}
Main(int a,float b){
System.out.println("float 1");
}
Main(float a,int b){
System.out.println("float 2");
}
public static void main (String[] args) {
byte a = 10;
byte b = 20;
Main obj = new Main(a,b);
}
}
Выход
int 1
Во втором коде компилятор выдает ошибку
public class Main
{
Main(long a,byte b){
System.out.println("int 1");
}
Main(int a,float b){
System.out.println("float 1");
}
Main(float a,int b){
System.out.println("float 2");
}
public static void main (String[] args) {
byte a = 10;
byte b = 20;
Main obj = new Main(a,b);
}
}
Ошибка
Main.java:25: error: reference to Main is ambiguous
Main obj = new Main(a,b);
^
both constructor Main(int,float) in Main and constructor Main(float,int) in Main match
1 error
** Process exited - Return Code: 1 **
Почему во втором коде не вызывается конструктор с длиной a и байтом b в качестве параметров?
Комментарии:
1. Какова ваша причина думать, что это должно быть?
2. Если бы вы добавили
Main(byte a,int b){ System.out.println("int 1a"); }
к своему первому примеру, у вас была бы та же проблема. Точного совпадения нет, и существует более одного одинаково взвешенного конструктора3. … Потому что так написано в стандарте, что это работает? Какой именно ответ вы ищете?
4. Почему в первом коде не было ошибки двусмысленности? Мне жаль, если я не понимаю никакого смысла
5. Здесь не было никакой двусмысленности, потому что Спецификация языка Java (JLS) точно определяет, как это должно быть решено.