Дополнительно
Почему Дон'т Ява'ы +=, -=, *=, /= составные операторы присваивания требуют литья?
До сегодняшнего дня я думал, что к примеру:
i += j;
Был просто ярлыком для:
i = i + j;
Но если мы попытаемся это сделать:
int i = 5;
long j = 8;
Потом я = я + Дж;
не будем обобщать, но я += Дж;
будет компилироваться нормально.
Это значит, что на самом деле я += Дж;
это что-то вроде этого ярлыка
я = (типа Я) (я + к)
?
3539
11
Как всегда с этими вопросами, ПСБ держит ответ. В этом случае §15.26.2 составные операторы присваивания. Выдержка:
Пример привел из §15.26.2
> и результаты в X принимает значения 7, потому что это эквивалентно:
Другими словами, ваше предположение верно.
Хорошим примером этого отливки с помощью *= или /=
или
или
или
Очень хороший вопрос. В спецификация языка Java подтверждает ваше предложение.
Да,
в основном, когда мы пишем
компилятор преобразует это
Я только что проверил `.файл с кодом класса.
Действительно хорошая вещь, чтобы знать
необходимо отлить из
длинных
вint
явно
в случаея = я + я
, то он будет компилироваться и дать правильный выход. какили
но в случае с
+=
, он просто отлично работает, потому что оператор неявно делает приведение типов от типа правый переменной тип переменной из левой поэтому не нужно явно привести.Проблема здесь заключается в тип литья.
Когда вы добавляете int и Long,
Но
+=
составлена таким образом, что это типа кастинг.я=(тип int)(я+м)
В преобразованиях типа Java выполняются автоматически, если тип выражения в правой части операции присваивания можно смело продвигал к типу переменной в левой части присваивания. Таким образом, можно смело присвоить: в <предварительно> В байт -> короткого> внутреннее -> давно> поплавок -> двойной. </пред> То же самое не будет работать наоборот. Например, мы не может автоматически преобразовать Long в int, потому что первый требует больше памяти, чем второй и, следовательно, информация может быть потеряна. В силу такого преобразования мы должны выполнять явное преобразование. Тип - Преобразования
Иногда такой вопрос можно задать на собеседовании.
Например, когда вы пишете:
нет автоматическая типажей. В C++ не будет ошибки компиляции кода выше, но в Java вы получите что-то вроде
несовместимы исключение типа
.Поэтому чтобы избежать этого, вы должны писать ваш код таким образом:
Главное отличие заключается в том, что с
= А + Б
, нет типажей, и поэтому компилятор злится на тебя за то, что не типажей. Но с+ = б
, что это'ов на самом деле типажей " Б "В тип, совместимый с "а". Так что если у васТо, что вы'вновь действительно делает это:
Тонкий момент здесь...
Существует неявное приведение типа
я+Дж
, когдаJ
в двойной ия
имеет тип int. Ява **** всегда преобразует целое в двойное, когда идет операция между ними.Для уточнения-я+=Дж
, где
япредставляет собой целое число и
J` двойной можно охарактеризовать какСм.: [это описание неявное приведение][1]
Возможно, вы захотите продолжать относиться к
J
для `(инт) в данном случае для ясности.[1]: https://www.cs.cmu.edu/~pattis/15-1ХХ/15-200/лекции/воу/лекция.сообщение: ImplicitConversion
Спецификацией языка Java определяет
Е1 ОП= Е2
эквивалентЕ1 = (Т) ((Е1) ОП (Е2))
, гдеT
- это тип " Е1 " и " Е1 " оценивается один раз.Что'С технической ответа, но вы можете быть удивлены, почему это's в случае. Ну, пусть'ы рассмотрим следующую программу.
Что это выводит программа?
Ты угадал 3? Жаль, Эта программа выиграла'т компиляции. Почему? Ну, бывает так, что кроме байтов в Java определяется, чтобы возвратить
инт
. Это, я считаю, что виртуальная машина Java не'т определить байтовые операции, чтобы сэкономить на байт-код (есть ограниченное количество тех, кто, в конце концов), вместо этого используя целочисленные операции является деталью реализации, выставленную на язык.Но если
А = А + Б
Не'т работу, что будет означатьа += б
никогда не буду работать на байт, если этоЕ1 += Е2
был определен, чтобы бытьЕ1 = Е1 + Е2
. Как показано в предыдущем примере, это было бы действительно так. Как рубить чтобы сделать работу оператора + = ` байты и шорты, есть неявное приведение участвует. Это's не то, что великий хак, но обратно на работу с Java 1.0, акцент был сделан на языке выпустили для начала. Теперь, из-за обратной совместимости, этот хак введены в Java 1.0 не мог'т быть удалены.