Интересное наблюдение за добавлением и назначением байтов - PullRequest
4 голосов
/ 06 марта 2012

Сегодня, помогая кому-то, я наткнулся на интересную проблему, в которой не мог понять причину.При использовании + = нам не нужно явное приведение, но когда мы используем i + i, нам нужно явное приведение.Не могу найти точную причину.Любой вклад будет оценен.

public class Test{
       byte c = 2;
       byte d = 5;

       public  void test(String args[])
       {
           c += 2;
           d = (byte) (d + 3);   
       }
    }

Ответы [ 2 ]

8 голосов
/ 06 марта 2012

Java определяется так, что + = и другие составные операторы присваивания автоматически приводят результат к типу обновляемой переменной.В результате приведение не требуется при использовании + =, хотя это необходимо при использовании обычных операторов.Вы можете увидеть это в Спецификации языка Java по адресу http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

В частности, выражение

a op= b

эквивалентно

(a = (type of a)((a) op (b));

Надеюсь, это поможет!

1 голос
/ 06 марта 2012

Из Java Спецификация языка, глава 15 :

[..] результат бинарной операции (Примечание: в нашем примере (c+2), что приводит к значению типа int) преобразуется в тип левой переменной (Примечание: в нашем примере - byte) , подвергнутый преобразованию набора значений (§5.1.13) в соответствующий стандартный набор значений (не набор значений с расширенным показателем) и результат преобразование сохраняется в переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...