演算子「+」はオブジェクトと文字列に適用できません


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でコンパイルされるのはなぜですか?これはどこかに文書化されていますか?


値は文字列である必要はないと思います。値が整数の場合、それに文字列を追加しても意味がありません。さようなら、値を文字列にキャストしようとすることができます
fedoraHacker

2
@fedoraHackerこの式 value = value + suffixは、値のタイプに関係なく完全に合法です。だから私にとってvalue += suffixも合法である必要があります。
グロドリゲス

わあ、分からなかった。さまざまなオブジェクトの要点は、データが実行できることと実行できないことのルールを定義することだと思いました。異なるデータ型とオブジェクトを持つことの全体のポイントは、型を確実に行う責任を分離することですが、それはうまくいきます。私はあなたがそのようなデータ型を混ぜることができると困惑しています。まあ、あなたは毎日何かを学んでいます:)そして、Value = value + suffixはvalue + = suffixとまったく同じですので、構文にまったく
異議を唱えません

1
はい。ただし、文字列型はやや特殊です。ここでの+演算子は「文字列連結演算子」です。オペランドの1つだけが文字列の場合、式が評価される前に、もう1つのオペランドは文字列に変換されます。JLSのこのセクションを参照してください。
グロドリゲス

ああ、なるほど、文字列がそのように変換されたことを知りませんでした。質問への回答が終わっても返信に時間を割いていただきありがとうございます。
fedoraHacker

回答:


16

JLS 15.26.2。複合代入演算子は次のように述べています。

フォームの複合代入式はE1 op= E2と同等ですE1 = (T) ((E1) op (E2))。ここTで、はのタイプですがE1E1一度しか評価されません。

その文はJava 6からJava 14まで同じであり、Javaの登場以来変更されていない可能性があります。

だからvalue += suffixと同じですvalue = (Object) (value + suffix)

Java 6コンパイラーは、そのステートメントのコンパイルに失敗してはなりません。


2
JDK(javac)のバグ。JLSへのポインタをありがとう、どういうわけかそれを逃した。
グロドリゲス

3
15.18.1。文字列連結演算子+も、同等のステートメントをvalue = (Object) (value + suffix)コンパイルする必要がある理由を説明するのに役立ちます。
デュケリング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.