Apa perbedaan antara ganda a = a + int b dan int a += ganda b?

Kenapa:

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

tidak dikompilasi tetapi:

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

mengkompilasi.


person rawnd    schedule 03.03.2009    source sumber


Jawaban (4)


Di Java += operator memiliki pemeran implisit ke tipe tangan kiri. Ini berlaku untuk semua operator yang tersusun.

person DefLog    schedule 03.03.2009
comment
Saya pikir ini adalah jawaban yang lebih ringkas - person matt b; 04.03.2009

int = int + double pada dasarnya

int = ganda + ganda

dan Anda tidak dapat melakukan itu tanpa casting...

Int += double memaksa hasilnya menjadi int sementara yang lainnya memerlukan casting.

Jadi a = (int)(a + b);

harus dikompilasi.

Sunting: seperti yang diminta di komentar... berikut ini tautan untuk membaca lebih lanjut (bukan yang paling mudah dibaca, tetapi info yang paling benar): http://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

person TofuBeer    schedule 03.03.2009
comment
bisakah Anda memberikan beberapa tautan untuk bacaan lebih lanjut? Terima kasih - person hhafez; 04.03.2009
comment
Saya pikir alasan utamanya adalah karena penetapannya tidak diperbolehkan sambil mempersempit: byte = int tidak diizinkan dan int = double juga. apakah seseorang akan melakukan byte a sederhana; sebuah += 2; dan gagal dikompilasi, orang akan melempar sepatu ke java. tapi saya masih menyukai aturan tambahan yang membuatnya berfungsi tanpa pemeran itu :( - person Johannes Schaub - litb; 04.03.2009
comment
Saya tidak yakin ada alasan yang mendalam, tetapi spesifikasi bahasa Java secara eksplisit mendefinisikan pemeran implisit: java.sun.com/docs/books/jls/second_edition/html/ - person DefLog; 04.03.2009

double + int menghasilkan double, jadi double = double + int sah, lihat JLS 5.1.2 Memperluas Konversi Primitif di sisi lain int = double + int adalah "Mempersempit Konversi Primitif" dan memerlukan pemeran yang eksplisit

person devdimi    schedule 04.03.2009

Seperti yang sudah dinyatakan semua orang, += memiliki pemeran implisit. Untuk membantu mengilustrasikannya, saya akan menggunakan aplikasi yang saya tulis beberapa waktu lalu yang sempurna untuk jenis pertanyaan ini. Ini adalah disassembler online sehingga Anda dapat memeriksa bytecode sebenarnya yang dihasilkan: http://javabytes.herokuapp.com/

Dan tabel artinya: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

Jadi mari kita lihat bytecode dari beberapa kode Java sederhana:

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

Kode dibongkar. Komentar saya akan memiliki // di depan.

   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)
person Jonnyman9    schedule 27.02.2013