Функционально выражения c = c * i;
и c *= i;
действительно эквивалентны - они должны делать то же самое.
Однако вы делаете расчеты с различными типами здесь (int
и char
) и языком программирования Java имеет правило о том, что преобразования между типами выполняются автоматически (без броска), и когда вы должны явно сделать бросок.
Эти преобразования подробно описаны в chapter 5 Спецификации языка Java.
Умножение на char
и int
в c * i
приводит к значению типа int
, как описано в 5.6.2 Binary Numeric Promotion. Затем вы пытаетесь присвоить это char
, который является narrowing primitive conversion, который не может быть выполнен без приведения.
15.26.2 Compound Assignment Operators объясняет такие операторы, как *=
. Этот пункт объясняет: выражение присваивания
Соединения формы E1 op= E2
эквивалентно E1 = (T) ((E1) op (E2))
, где T
является типом E1
, за исключением того, что E1
вычисляются только один раз.
Обратите внимание, что приведение к типу левой переменной неявно выполняется. Так что если вы делаете c *= i;
, это эквивалентно:
c = (char)(c * i);
Бросок от int
к char
делается неявно.
'с * i' является' 'int', когда с * = i' является' char' –