3

Имеется тестовый кусок кода.

public class Test {
    public static void main(String[] args) {
            int i = 2;
            char c = '1';
            c = (char) c * i; //ошибка компиляции
            System.out.println(c);
    }
}

Но

...
c *= i; //выводит b
...

Почему?

Lancelot
  • 561
  • @VladfromMoscow это другой вопрос, т.к. здесь идёт речь о преобразовании одного типа в другой. Ниже приведёт правильный ответ, который разница от того вопроса, который вы упомянули. – Lancelot Jan 04 '19 at 11:15
  • 1
    Ваш вопрос абсолютно дублирует тот вопрос, который я указал. Разница лишь в типе бинарного оператора - вместо умножения используется сложение. – Vlad from Moscow Jan 04 '19 at 11:17
  • @VladfromMoscow мой вопрос заключался в нахождении ошибки компиляции. Я не понимал, как это работает. То, что ответ плавно вытекает из общей спецификации не говорит, что задаваемые вопросы дублируются. Следуя Вашей логике в этом случае, все вопросы на сайте вытекают из основ дискретной математики и их применения. Пометить все вопросы дубликатами и ссылать на учебник по дискретной математике? Слишком утрировал, но смысл понятен. – Lancelot Jan 04 '19 at 11:26
  • https://ru.meta.stackoverflow.com/q/8478/213987 – A K Jan 07 '19 at 18:48
  • @AK ну... тогда переоткроем? Данный вопрос затрагивает даже не операторы, а явное и неявное приведение типов при выполнении операторов. c *= i; это не явное приведение типов. А c = (char)(c * i) - явное. – nick_n_a Jan 16 '19 at 08:26
  • @nick_n_a Я бы рекомендовал в подобных случаях собирать пятёрку на переоткрытие из людей обладающих весомой репутацией по java. Свою репутацию по этой метке считаю недостаточной. – A K Jan 16 '19 at 08:28

1 Answers1

8

Если посмотреть в спецификацию то можно увидеть что E1 op= E2 эквивалентно E1 = (T) ((E1) op (E2)) где T это тип E1.

Поэтому

 c *= i;

из вашего примера эквивалентно

c = (char)(c * i);

В случае c = (char)c * i; проблема в том что оно парсится как c = ((char)c) * i; и когда мы умножаем ((char)c) на i результат расширяется до int.

talex
  • 2,321
  • Спасибо! Я разобрался. Но, получается, что присваивание к типу происходит раньше, ежели операция умножения? – Lancelot Jan 04 '19 at 11:12