Неявный тип приведения не работает для параметров метода?

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

class TypeCast{
  public static void main(String[] args){
    byte by = 4;     //compiler casts int literal to byte

    doCasting(4);    //Compilation Error: external type casting is required. WHY ?

  }

  public static void doCasting(byte by){

  }

}

Я думаю, что над фрагментом кода довольно понятно. В то время как int литеральное присвоение типа byte компилятор автоматически выполняет автоматический запуск. То же самое не происходит, когда мы вызываем метод, принимающий параметр byte с int literal. Почему?

Ответы

Ответ 1

В этом разница между контекстом назначения (JLS 5.2) и контекстом вызова (JLS 5.3) для конверсий.

Преобразование контекста присваивания включает в себя:

Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int:

  • Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, а значение константного выражения представляется в типе переменной.

То, что отсутствует в преобразованиях контекста вызова.

Мне непонятно, почему язык был спроектирован таким образом, кроме как, возможно, упростить разрешение перегрузки - если у вас было:

doCasting(5);
...
doCasting(int x) {}
doCasting(byte b) {}

тогда вы можете утверждать, что любой из них является "лучшим совпадением" - byte является более конкретным типом, чем int, но если вы думаете о том, что литерал имеет тип int, тогда byte overload make требует преобразования, тогда как перегрузка int не работает.

Если перегрузка byte просто неприменима, вопрос будет удален.