'+' Operatörü Nesne ve Dizeye uygulanamaz


12

Aşağıdaki kod:

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

    [...]
}

JDK 8'de hatasız derler (-source 1.6 kullanarak), ancak JDK 6'da hata iletisiyle başarısız olur:

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

Hatanın ne ile ilgili olduğunu anlasam da, bu neden JDK 8 ile derleniyor? Bu herhangi bir yerde belgelenmiş mi?


Sanırım değer String olmak zorunda değil. Değer bir tamsayı ise, o zaman bir dize eklemek mantıklı değil. Maybye, string'e değer atmayı deneyebilirsiniz
fedoraHacker

2
@fedoraHacker İfade value = value + suffix, değer türünden bağımsız olarak tamamen yasaldır. Yani bana value += suffixgöre yasal olmalı.
Grodriguez

vay, hiçbir fikrim yoktu. Farklı nesnelerin asıl amacının verinin yapabilecekleri ve yapamayacağı kuralları tanımlamak olduğunu düşündüm. Farklı veri türlerine ve nesnelere sahip olmanın asıl amacı, türlerin bir şey yaptığını, ancak iyi yaptığını sağlamak için sorumluluğu ayırmaktır. Sadece böyle veri tiplerini karıştırabileceğiniz için şaşırıyorum. Peki her gün bir şey öğrenmek :) ve Value = değer + sonek excact aynı değer + = sonek ile aynıdır, bu yüzden ben sözdizimi hiç anlaşmazlık yok
fedoraHacker

1
Evet, ancak Dize türü biraz özeldir. Burada + işleci "dize birleştirme işleci" dir; işlenenlerden yalnızca biri bir dize ise, diğeri ifade değerlendirilmeden önce bir dizeye dönüştürülür. JLS'nin bu bölümüne bakın .
Grodriguez

Ah görüyorum, string böyle dönüştürdü bilmiyordum. Soru cevaplandıktan sonra bile yanıt vermek için zaman ayırdığınız için teşekkür ederiz!
fedoraHacker

Yanıtlar:


16

JLS 15.26.2. Bileşik Atama Operatörleri şunları belirtir:

Şeklinde olan bir bileşik atama ifade E1 op= E2eşdeğerdir E1 = (T) ((E1) op (E2)), burada Ttürüdür E1dışında, E1sadece bir kere elde edildi.

Bu cümle aynı olan Java 6 için Java 14 , ve büyük olasılıkla Java başından bu yana hiç değişmedi.

Yani value += suffixaynıvalue = (Object) (value + suffix)

Java 6 derleyicisi bu ifadeyi derleyememiş olmalıdır.


2
JDK (javac) hatası. JLS'ye işaretçi için teşekkürler, bir şekilde bunu kaçırdım.
Grodriguez

3
15.18.1. Dize Birleştirme Operatörü + , eşdeğer ifadesinin neden value = (Object) (value + suffix)derlenmesi gerektiğini açıklamakla da ilgilidir .
Dukeling
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.