Operator '+' tidak dapat diterapkan ke Obyek dan String

12

Kode berikut:

void someMethod(Object value)
{
    String suffix = getSuffix();
    if (suffix != null)
        value += suffix;

    [...]
}

kompilasi tanpa kesalahan di JDK 8 (menggunakan -sumber 1.6), tetapi gagal di JDK 6 dengan pesan kesalahan:

Operator '+' cannot be applied to java.lang.Object and java.lang.String

Sementara saya mengerti apa kesalahannya, mengapa ini dikompilasi dengan JDK 8? Apakah ini didokumentasikan di mana saja?

Grodriguez
sumber
Saya kira nilai tidak harus menjadi String. Jika nilai adalah Integer maka saya tidak masuk akal untuk menambahkan string ke dalamnya. Semoga Anda dapat mencoba memberikan nilai ke string
fedoraHacker
2
@fedoraHacker Ekspresi value = value + suffixini sepenuhnya legal terlepas dari jenis nilainya. Jadi menurut saya value += suffixharus legal juga.
Grodriguez
wow, saya tidak tahu. Saya berpikir bahwa seluruh titik objek yang berbeda adalah untuk menetapkan aturan untuk apa data dapat dan tidak bisa dilakukan. Inti dari memiliki tipe data dan objek yang berbeda adalah untuk memisahkan tanggung jawab untuk memastikan tipe melakukan satu hal, tetapi melakukannya dengan baik. Saya hanya bingung bahwa Anda dapat mencampur tipe data seperti itu. Yah Anda belajar sesuatu setiap hari :) dan Value = value + suffix adalah excact sama dengan value + = suffix, jadi saya tidak membantah sintaks sama sekali
fedoraHacker
1
Ya tapi tipe String agak spesial. Operator + di sini adalah "operator penggabungan string"; jika hanya satu operan yang berupa string, yang lain dikonversi menjadi string sebelum ekspresi dievaluasi. Lihat bagian JLS ini .
Grodriguez
Ah saya mengerti, tidak tahu string mengubahnya seperti itu. Terima kasih telah meluangkan waktu untuk membalas bahkan setelah pertanyaan telah dijawab!
fedoraHacker

Jawaban:

16

JLS 15.26.2. Operator Penugasan Senyawa menyatakan:

Ekspresi penugasan majemuk bentuk E1 op= E2setara dengan E1 = (T) ((E1) op (E2)), di mana Tjenis E1, kecuali yang E1dievaluasi hanya sekali.

Kalimat itu sama dari Jawa 6 ke Jawa 14 , dan kemungkinan tidak pernah berubah sejak awal Jawa.

Begitu value += suffixjuga denganvalue = (Object) (value + suffix)

Kompiler Java 6 seharusnya tidak gagal untuk mengkompilasi pernyataan itu.

Andreas
sumber
2
Bug JDK (javac) lalu. Terima kasih atas pointer ke JLS, entah bagaimana saya melewatkannya.
Grodriguez
3
15.18.1. String Concatenation Operator + juga relevan untuk menjelaskan mengapa pernyataan setara value = (Object) (value + suffix)harus dikompilasi.
Dukeling