Оператор "+" не можна застосувати до "Об'єкт і рядок"


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. Якщо значення є цілим числом, то я не маю сенсу додавати до нього рядок. Maybye ви можете спробувати надати значення рядку
fedoraHacker

2
@fedoraHacker Вираз value = value + suffixє повністю законним незалежно від типу значення. Тож, мені здається, value += suffixтеж має бути законно.
Grodriguez

уау, я поняття не мав. Я думав, що вся суть різних об’єктів полягає у визначенні правил того, що дані можуть робити, а що не можна. Весь сенс наявності різних типів даних та об'єктів полягає у роздільній відповідальності за переконання, що типи виконують одне, але це добре. Мене просто бентежить, що ви можете змішувати подібні типи даних. Що ж, ви дізнаєтесь щось щоденне :), а значення = значення + суфікс - це еквівалент, як значення + = суфікс, тому я взагалі не
оспорюю

1
Так, але тип String є дещо особливим. Оператор + тут ​​- "оператор конкатенації рядків"; якщо лише один з операндів є рядком, інший перетворюється в рядок перед тим, як вираження буде оцінено. Дивіться цей розділ JLS .
Grodriguez

Ну я бачу, не знав, рядок перетворив це так. Дякуємо, що знайшли час для відповіді навіть після відповіді на запитання!
fedoraHacker

Відповіді:


16

JLS 15.26.2. Оператори комплексного призначення :

Вираження складної форми форми 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. Оператор об'єднання рядків + також має значення для пояснення того, чому value = (Object) (value + suffix)повинен складатися еквівалентний оператор .
Герцогство
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.