В первом сценарии подвыражение (byteChallenge + shortChallenge + intChallenge)
в основном равно "byte + short + int
". Java сначала оценивает эту часть, а затем умножает на 10 и добавляет к 50000.
Поскольку подвыражение не включает тип long
, Java не имеет смысла делать тип результата выражение long
, поэтому первые два операнда переводятся только в int
, а три int
добавляются вместе, чтобы получить еще один int
. Это вызывает переполнение, что делает результат очень отрицательным.
Во втором случае вы явно приводите все три операнда к long
перед тем, как с ними работать, поэтому тип подвыражения разрешается равным long
.
Урок здесь заключается в том, что вложенные выражения обрабатываются так же, как и любые другие выражения. (byteChallenge + shortChallenge + intChallenge)
не получает особого отношения только потому, что оно умножено на long
. Его значение по-прежнему оценивается так же.