Ответ 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
просто неприменима, вопрос будет удален.