Странное приведение типов при выполнении variableOfTypeA + = variableOfTypeB - PullRequest
0 голосов
/ 13 марта 2012

Я использую Java и новичок в этом.

Когда я пытаюсь

int integerValue = 100;
long longValue = 100;
integerValue = integerValue + longValue;

Я получаю «Несоответствие типов: невозможно преобразовать long в int».

Но

integerValue+=longValue; 

работает нормально, что означает, что он выполняет приведение для меня:)

Это то, что "+ =" обеспечивает по своей природе? Есть какая-то конкретная причина для этого?

Редактировать: Ой !! Слишком общий вопрос! :) Я должен был сначала тщательно обыскать, мой плохой !!

Ответы [ 5 ]

3 голосов
/ 13 марта 2012

Да, это ведет себя именно так, как объясняет раздел 15.26.2 JLS .

Составное выражение присваивания в форме E1 op= E2 эквивалентно E1 = (T) ((E1) op (E2)), где T - это тип E1, за исключением того, что E1 вычисляется только один раз.

2 голосов
/ 13 марта 2012

Вы обнаружили загадку Твидледума из книги Java Puzzlers .В основном составное присваивание выполняет приведение типа, а обычное - нет.Подробнее см. JLS .

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

Это правильно. В первом примере вы должны привести к int, потому что результатом левого выражения является значение long (только потому, что longValue равно long).

 integerValue = (long) (integerValue + longValue);  // this works

Оператор += делает (ту же) простоту приведения.

Оба поведения указаны в Спецификации языка Java.

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

Используя операторы назначения операций, существует неявное приведение.

int i = 10;
i *= 5.5;
// same as
i *= (int) (i * 5.5);

или даже

char ch = '5';
ch /= 1.1; // ch = '0'
0 голосов
/ 14 марта 2012

Спасибо всем!

Все ответы были достаточно хорошими!

Более подробные объяснения и примеры доступны на stackoverflow.com / questions / 8710619 / java-operator :)

...