Toán tử '+' không thể được áp dụng cho Object và String


12

Các mã sau đây:

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

    [...]
}

biên dịch không có lỗi trong JDK 8 (sử dụng -source 1.6), nhưng không thành công trong JDK 6 với thông báo lỗi:

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

Trong khi tôi hiểu lỗi là gì, tại sao điều này lại biên dịch với JDK 8? Đây có phải là tài liệu ở bất cứ đâu?


Tôi đoán giá trị không phải là String. Nếu giá trị là một số nguyên thì tôi không có ý nghĩa gì khi thêm một chuỗi vào nó. Maybye bạn có thể thử chuyển giá trị thành chuỗi
fedoraHacker

2
@fedoraHacker Biểu thức value = value + suffixlà hoàn toàn hợp pháp bất kể loại giá trị. Vì vậy, nó có vẻ như value += suffixlà hợp pháp quá.
Grodriguez

wow, tôi không có ý tưởng. Tôi nghĩ rằng toàn bộ quan điểm của các đối tượng khác nhau là xác định quy tắc cho những gì dữ liệu có thể và không thể làm. Toàn bộ quan điểm của việc có các kiểu dữ liệu và đối tượng khác nhau là tách biệt trách nhiệm để đảm bảo các kiểu thực hiện một việc, nhưng thực hiện tốt. Tôi chỉ bối rối rằng bạn có thể trộn các kiểu dữ liệu như vậy. Vâng, bạn học được điều gì đó hàng ngày :) và Value = value + hậu tố là chính xác giống như value + = hậu tố, vì vậy tôi không tranh chấp cú pháp nào cả
fedoraHacker

1
Có nhưng loại String có phần đặc biệt. Toán tử + ở đây là "toán tử nối chuỗi"; nếu chỉ một trong các toán hạng là một chuỗi, thì một chuỗi khác được chuyển đổi thành một chuỗi trước khi biểu thức được ước tính. Xem phần này của JLS .
Grodriguez

Ah tôi hiểu rồi, không biết chuỗi đã chuyển đổi nó như thế. Cảm ơn đã dành thời gian trả lời ngay cả khi câu hỏi đã được trả lời!
fedoraHacker

Câu trả lời:


16

JLS 15,26.2. Toán tử chuyển nhượng hợp chất nêu:

Một biểu thức gán tổng hợp của biểu mẫu E1 op= E2tương đương với E1 = (T) ((E1) op (E2)), trong đó Tlà loại E1, ngoại trừ chỉ E1được đánh giá một lần.

Câu đó giống nhau từ Java 6 đến Java 14 và có thể chưa bao giờ thay đổi kể từ khi bắt đầu Java.

Vì vậy, value += suffixcũng giống nhưvalue = (Object) (value + suffix)

Trình biên dịch Java 6 không nên biên dịch câu lệnh đó.


2
Lỗi JDK (javac) rồi. Cảm ơn bạn đã đưa con trỏ đến JLS, bằng cách nào đó tôi đã bỏ lỡ điều đó.
Grodriguez

3
15,18.1. Toán tử nối chuỗi + cũng có liên quan để giải thích tại sao câu lệnh tương đương value = (Object) (value + suffix)nên biên dịch.
Dukeling
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.