В чем разница между double a = a + int b и int a + = double b? - PullRequest
30 голосов
/ 04 марта 2009

Почему:

public class Addition { 
  public static void main() { 
    int a = 0; 
    double b = 1.0; 
    a = a + b;
    System.out.println(a); 
  }
}

не компилируется, но:

public class Addition { 
  public static void main() { 
    int a = 0; 
    double b = 1.0; 
    a += b; 
    System.out.println(a); 
  }
}

компилирует.

Ответы [ 4 ]

32 голосов
/ 04 марта 2009

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

23 голосов
/ 04 марта 2009

int = int + double по существу

int = double + double

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

int + = double возвращает результат в int, в то время как другой требует приведения.

Итак, a = (int) (a + b);

должен скомпилироваться.

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

4 голосов
/ 04 марта 2009

double + int возвращает double, поэтому double = double + int является допустимым, см. JLS 5.1.2 Расширяющее примитивное преобразование с другой стороны int = double + int - "Сужающее примитивное преобразование" и требует явного приведения

0 голосов
/ 27 февраля 2013

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

И таблица их значений: 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)
...