Спецификация языка Java определяет, E1 op= E2
что она эквивалентна типу E1 = (T) ((E1) op (E2))
where и оценивается один разT
E1
E1
.
Это технический ответ, но вам может быть интересно, почему это так. Что ж, давайте рассмотрим следующую программу.
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
Что печатает эта программа?
Вы догадались 3? Жаль, что эта программа не скомпилируется. Почему? Что ж, бывает так, что добавление байтов в Java определено как возвращающееint
. Я полагаю, это произошло потому, что виртуальная машина Java не определяет байтовые операции для сохранения в байтовых кодах (в конце концов, их число ограничено), а использование целочисленных операций - это деталь реализации, представленная на языке.
Но если a = a + b
не работает, это означало a += b
бы, что никогда не будет работать для байтов, если это E1 += E2
было определено как E1 = E1 + E2
. Как показывает предыдущий пример, это действительно так. В качестве хака, заставляющего +=
оператора работать для байтов и шортов, подразумевается неявное приведение. Это не так здорово, но во время работы над Java 1.0 основное внимание уделялось выпуску языка с самого начала. Теперь, из-за обратной совместимости, этот хак, введенный в Java 1.0, не может быть удален.