Почему байт не получает повышение типа до long (повышение типа во время перегрузки метода)

#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) точно определяет, как это должно быть решено.