ผู้ประกอบการ '+' ไม่สามารถนำไปใช้กับวัตถุและสตริง


12

รหัสต่อไปนี้:

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

    [...]
}

รวบรวมโดยไม่มีข้อผิดพลาดใน JDK 8 (ใช้ -source 1.6) แต่ล้มเหลวใน JDK 6 พร้อมข้อความแสดงข้อผิดพลาด:

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

ในขณะที่ฉันเข้าใจว่าข้อผิดพลาดเกี่ยวกับอะไรทำไมถึงต้องคอมไพล์ด้วย JDK 8? เอกสารนี้มีอยู่ทุกที่หรือไม่?


ฉันเดาว่าค่าไม่จำเป็นต้องเป็น String ถ้า value เป็นจำนวนเต็มดังนั้นฉันไม่สมเหตุสมผลที่จะเพิ่มสตริงเข้าไป อาจบายคุณสามารถลองใส่ค่าลงใน string
fedoraHacker

2
@fedoraHacker นิพจน์ value = value + suffixนั้นถูกกฎหมายอย่างสมบูรณ์โดยไม่คำนึงถึงประเภทของค่า ดังนั้นดูเหมือนว่าฉันvalue += suffixควรถูกกฎหมายด้วย
Grodriguez

ว้าวฉันไม่รู้เลย ฉันคิดว่าจุดรวมของวัตถุที่แตกต่างกันคือการกำหนดกฎสำหรับข้อมูลที่สามารถทำได้และไม่สามารถทำได้ จุดทั้งหมดของการมีประเภทข้อมูลและวัตถุที่แตกต่างกันคือการแยกความรับผิดชอบเพื่อให้แน่ใจว่าประเภททำสิ่งเดียว แต่ทำได้ดี ฉันแค่งุนงงว่าคุณสามารถผสมประเภทข้อมูลเช่นนั้นได้ คุณได้เรียนรู้อะไรบางอย่างทุกวัน :) และค่า = ค่า + คำต่อท้ายคือ excact เช่นเดียวกับค่า + = คำต่อท้ายดังนั้นฉันไม่โต้แย้งไวยากรณ์เลย
fedoraHacker

1
ใช่ แต่ประเภทสตริงนั้นค่อนข้างพิเศษ ตัวดำเนินการ + ที่นี่คือ "ตัวดำเนินการเรียงสตริง"; ถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นสตริงตัวอื่นจะถูกแปลงเป็นสตริงก่อนที่นิพจน์จะถูกประเมิน ดูส่วนของ JLS
Grodriguez

ฉันเข้าใจแล้วไม่ทราบว่าสายแปลงเป็นแบบนั้น ขอบคุณที่สละเวลาตอบแม้คำถามจะได้รับคำตอบ!
fedoraHacker

คำตอบ:


16

JLS 15.26.2 สถานะผู้ประกอบการกำหนด Compound :

นิพจน์การมอบหมายผสมของฟอร์มE1 op= E2เทียบเท่ากับE1 = (T) ((E1) op (E2))โดยที่Tเป็นชนิดของE1ยกเว้นว่าE1ถูกประเมินเพียงครั้งเดียว

ประโยคนั้นเหมือนกันจากJava 6ถึงJava 14และมีแนวโน้มที่ไม่เคยเปลี่ยนแปลงตั้งแต่เริ่มต้นของ Java

ดังนั้นvalue += suffixเป็นเช่นเดียวกับvalue = (Object) (value + suffix)

คอมไพเลอร์ Java 6 ไม่ควรล้มเหลวในการรวบรวมคำสั่งนั้น


2
ข้อผิดพลาด JDK (javac) ขอบคุณสำหรับตัวชี้ไปยัง JLS ฉันคิดถึงสิ่งนั้น
Grodriguez

3
15.18.1 String Concatenation Operator +ยังเกี่ยวข้องเพื่ออธิบายว่าทำไมคำสั่งที่เทียบเท่าของvalue = (Object) (value + suffix)ควรรวบรวม
Dukeling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.