Вопрос @RomanC очень прост, если вы видите соответствующий код. Почему неявное сужающее преобразование предоставляется в одном случае (int литерал в байт), но не в другом случае (длинный литерал в int). Снова обновил вопрос, чтобы сделать его более понятным

отрим приведенный ниже фрагмент кода:

// automatic casting works for int to byte conversion as integer literal 127
// is in the range for byte
byte b1 = 127; //OK

// automatic casting doesn't work for long to int conversion 
// even if long literal is in the range of int.
int i5 = 100L; // NOT OK - compilation error

Есть ли объяснение такого поведения?

Почему явное преобразование не требуется в случае int в байты, но необходимо для длинных в int?

Как Java конвертирует int в байты? вопрос в другом. Речь идет о проблеме неявного преобразования int в байт, когда значение int выходит за пределы диапазона.

 simpleDev29 дек. 2017 г., 17:02
Но почему это нравится в случае преобразования int в байты?
 van dench29 дек. 2017 г., 17:09
Потому что127 не имеет буквального суффикса. Java может преобразовать его в соответствующий тип.
 simpleDev29 дек. 2017 г., 17:08
Обновленный Вопрос для большей ясности: почему явное преобразование не требуется в случае int в байты, но необходимо для long в int?
 van dench29 дек. 2017 г., 17:01
Java не любит потерю конверсии; он не знает, что нет реальной потери.
 simpleDev29 дек. 2017 г., 17:03
@AniketSahrawat то же самое относится к int и byte ..

Ответы на вопрос(2)

byte вint) обычно принимаются неявно компилятором Java, так как нет потери информации (диапазонint больше, чем уbyte).

Сужающие преобразования (например,long вint(как в вашем случае) может привести к потере информации, поэтому обычно требуетсяэксплицитно литая.

Видетьэто аналогичный вопрос, иэто, Соответствующая частьСпецификация языка Java:

Преобразование присваивания происходит, когда значение выражения присваивается (§15.26) переменной: тип выражения должен быть преобразован в тип переменной.

...

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

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

Преобразование примитива сужения, сопровождаемое преобразованием бокса, может использоваться, если тип переменной:

Байт и значение константного выражения представимы в байте типа

Short и значение константного выражения представимо в типе short.

Символ и значение константного выражения представляются в типе char.

(акцент мой)

Некоторая путаница связана с тем, что мы имеем дело, в частности, сконстантные выражения, так как мы используем числовые литералы. Приведенная выше спецификация также требует внимательного прочтения.

Чтобы прояснить некоторые вопросы и напрямую ответить на некоторые запросы ОП:

Почему неявное сужение поддерживается для одного типа сужения, а не для другого?

То есть. Почемуbyte b1 = 127 работать безоговорочно, в то время какint i5 = 100L не?

byte b1 = 127 выполняет неявное преобразование, как (см. жирный текст в приведенной выше цитате), «значение константного выражения представимо в байте типа». Это,127 представимаbyte, поэтому преобразование неявное. Если вы пытаетесьbyte b1 = 128вы получите ошибку о несовместимых типах, так как128 не может быть представленbyte, Единственная причина, по которой нам здесь разрешено неявное приведениевообще потому что мы используемпостоянное выражение.

Мы не получаем неявное преобразование вint i5 = 100L (хотя 100 находится в диапазонеint) поскольку это просто не указано в разрешенных неявных преобразованиях (тип переменной,intне является одним изbyte, short, или жеchar).

Мы также не получаем неявное преобразование вbyte a = 0L, на этот раз, поскольку константное выражение имеет типlongне типbyte, short, char, или жеint.

Как обычный программист узнает, какое сужающее преобразование разрешено неявно?

Неявные сужающие преобразования происходят только при назначениипостоянное выражение в переменную. В этих случаях неявные преобразования хороши, так как мы не хотим писать кодbyte b = (byte)0 все время. В то же время мыделать хочу быть предупрежденным, если мы напишем что-то вродеbyte b = 128, поскольку это не имеет интуитивного поведения.

Когда мы не присваиваем константные выражения (например,int x = 0; byte b = x;), мы всегда хотим, чтобы нас предупреждали, когда мы выполняем преобразование с потенциальными потерями, поскольку они опасны - поэтому явные преобразования в этом случае также имеют смысл.

 simpleDev29 дек. 2017 г., 18:59
Спасибо, hnefatl. Я до сих пор не могу понять: 1. Почему неявное преобразование поддерживается для одного типа сужения, а не для другого. 2. Как нормальный программист узнает, какое сужающее преобразование разрешено неявно, а какое требует явных усилий. - Или программист должен ждать, пока не произойдет ошибка компиляции? Если это так, то это странно!
 Roman C29 дек. 2017 г., 18:41
Я не буду здесь ничего добавлять, но скажу, что это просто копия / вставка из официальных документов.
 hnefatl29 дек. 2017 г., 19:38
@simpleDev Я попытался ответить на эти вопросы в своем редактировании, дайте мне знать, если что-то еще неясно.
 hnefatl29 дек. 2017 г., 22:17
@RomanC Я отредактировал свой пост, включив в него объяснение соответствующего раздела спецификации языка, а также анализ этой конкретной ситуации.
 Roman C01 янв. 2018 г., 02:56
Вы не понимаете спецификацию. который неверно истолкован вами. Я не имею в виду, что это неправильно, но это не тот же смысл.

Вы должны кастовать вручную

int i5 = (int)100L; 

Поскольку тип long имеет 8 байт ...

 simpleDev29 дек. 2017 г., 17:49
@RomanC 1. Этот вопрос о том, ПОЧЕМУ неявное преобразование недопустимо долго для int, когда оно разрешено для int в байтах. 2. Вопрос, помеченный вами как дубликат, отличается. "Как Java конвертирует int в байты?" вопрос в другом. Речь идет о проблеме неявного преобразования int в байт, когда значение int выходит за пределы диапазона
 Aniket Sahrawat29 дек. 2017 г., 17:03
Вы можете рассмотреть возможность добавления предупреждения о потере точности
 simpleDev29 дек. 2017 г., 19:06
Вопрос @RomanC очень прост, если вы видите соответствующий код. Почему неявное сужающее преобразование предоставляется в одном случае (int литерал в байт), но не в другом случае (длинный литерал в int). Снова обновил вопрос, чтобы сделать его более понятным
 simpleDev29 дек. 2017 г., 17:04
Благодарю. Да, я знаю это. Я не могу понять, почему это не требуется в случае int для байта
 Mark Rotteveel29 дек. 2017 г., 17:10
В Java long составляет 8 байтов, а int - 4 байта.

Ваш ответ на вопрос