2009-03-03 8 views

ответ

23

INT = INT + удвоится по существу

INT = двойной + двойной

и вы не можете сделать это без литья ...

ИНТ + = двойной силам результат к ИНТ время другой требует литья.

Таким образом, a = (int) (a + b);

следует скомпилировать.

Edit: в соответствии с просьбой в комментариях ... вот ссылка на более чтение (не самый легкий для чтения, но наиболее правильный данные): http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+0

Не могли бы вы предоставить некоторую ссылку на это для дальнейшего чтения? Спасибо – hhafez

+0

Я думаю, что «глубокая» причина заключается в том, что она запрещена назначать при сужении: byte = int запрещен и int = double тоже. выполнил бы простой байт a; a + = 2; и не скомпилировать, люди бросали ботинки в java. но мне все равно понравились бы дополнительные правила, которые заставили бы его работать без этого акта :( –

+0

Я не уверен, что есть глубокая причина, но спецификация языка Java явно определяет неявный листинг: http://java.sun.com/ docs/books/jls/second_edition/html/expressions.doc.html # 5304 – DefLog

32

В Java оператор + = имеет неявное приведение к левый рука type. Это касается всех составленных операторов.

+1

Я думаю, что это более краткий ответ –

4

двойной + INT возвращает двойной, так двойной = двойной + INT является законным, см JLS 5.1.2 Расширяя примитив Преобразование с другой стороны INT = двойной + ИНТ «Сужение примитив Преобразование» и требует явного приведения

0

Как уже было сказано, символ + = имеет неявный литой. Чтобы проиллюстрировать это, я собираюсь использовать приложение, которое я написал некоторое время назад, которое идеально подходит для этих типов вопросов. Это онлайн ассемблер, так что вы можете проверить фактический байткод, который производится: http://javabytes.herokuapp.com/

и таблица их значений: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

Итак, давайте посмотрим на байткод из некоторого простого кода Java:

int i = 5; 
long j = 8; 
i += j; 

Демонтированный код. Мои комментарии будут иметь // впереди.

Code: 
     0: iconst_5 //load int 5 onto stack 
     1: istore_0 //store int value into variable 0 (we called it i) 
     2: ldc2_w #2; //long 8l 
        //load long 8 value onto stack. Note the long 8l above 
        //is not my comment but how the disassembled code displays 
        //the value long 8 being used with the ldc2_w instruction 
     5: lstore_1 //store long value into variable 1 (we called it j) 
     6: iload_0 //load int value from variable 0 
     7: i2l  //convert int into a long. At this point we have 5 long 
     8: lload_1 //load value from variable 1 
     9: ladd  //add the two values together. We are adding two longs 
        //so it's no problem 
     10: l2i  //THIS IS THE MAGIC. This converts the sum back to an int 
     11: istore_0 //store in variable 0 (we called it i) 
Смежные вопросы