ऑपरेटर '+' को ऑब्जेक्ट और स्ट्रिंग पर लागू नहीं किया जा सकता है


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

जबकि मैं समझता हूं कि त्रुटि क्या है, यह जेडीके 8 के साथ क्यों संकलन करता है? क्या यह कहीं भी प्रलेखित है?


मुझे लगता है कि मूल्य स्ट्रिंग नहीं होना चाहिए। यदि मूल्य एक पूर्णांक है, तो मैं इसे एक स्ट्रिंग जोड़ने के लिए समझ में नहीं आता है। Maybye आप स्ट्रिंग के लिए डाली मूल्य की कोशिश कर सकते
fedoraHacker

2
@fedoraHacker value = value + suffixमूल्य के प्रकार की परवाह किए बिना अभिव्यक्ति पूरी तरह से कानूनी है। तो ऐसा लगता है कि मुझे value += suffixभी कानूनी होना चाहिए।
ग्रोड्रिग्ज

वाह, मुझे पता नहीं था। मैंने सोचा था कि विभिन्न वस्तुओं का पूरा बिंदु डेटा क्या कर सकता है और क्या नहीं कर सकता के लिए नियमों को परिभाषित करना था। अलग-अलग डेटाैटिप्स और ऑब्जेक्ट होने का पूरा बिंदु यह सुनिश्चित करने के लिए ज़िम्मेदारी को अलग करना है कि कोई एक चीज़ करता है, लेकिन यह अच्छी तरह से करता है। मैं केवल इस बात से चकित हूं कि आप उस तरह से डेटाटिप्स मिला सकते हैं। वैसे आप हर रोज कुछ सीखते हैं :) और मान = मान + प्रत्यय मूल्य + = प्रत्यय के समान है, इसलिए मैं वाक्यविन्यास का विवाद नहीं करता
फेडोराहैकर

1
हां लेकिन स्ट्रिंग प्रकार कुछ विशेष है। यहां + ऑपरेटर "स्ट्रिंग कॉन्फैनेटेशन ऑपरेटर" है; यदि केवल एक ऑपरेंड एक स्ट्रिंग है, तो दूसरा एक्सप्रेशन के मूल्यांकन से पहले एक स्ट्रिंग में बदल जाता है। JLS का यह खंड देखें ।
ग्रोड्रिगुएज़

आह मैं देख रहा हूँ, पता नहीं स्ट्रिंग इसे इस तरह परिवर्तित कर दिया। प्रश्न का उत्तर दिए जाने के बाद भी उत्तर देने के लिए धन्यवाद!
फेडोराहैकर

जवाबों:


16

JLS 15.26.2। कंपाउंड असाइनमेंट ऑपरेटर कहते हैं:

प्रपत्र E1 op= E2का एक मिश्रित असाइनमेंट अभिव्यक्ति के बराबर है E1 = (T) ((E1) op (E2)), जहां Tप्रकार है E1, सिवाय इसके कि E1केवल एक बार मूल्यांकन किया जाता है।

यह वाक्य जावा 6 से जावा 14 तक एक ही है , और संभवतः जावा की शुरुआत के बाद से कभी नहीं बदला है।

तो value += suffixजैसा है वैसा ही हैvalue = (Object) (value + suffix)

जावा 6 संकलक को उस कथन को संकलित करने में विफल नहीं होना चाहिए।


2
JDK (javac) बग तब। जेएलएस के लिए पॉइंटर के लिए धन्यवाद, किसी तरह मैंने उसे याद किया।
ग्रोड्रिग्ज

3
15.18.1। स्ट्रिंग कॉनैटैनेशन ऑपरेटर + को यह समझाने के लिए भी प्रासंगिक है कि समकक्ष कथन का value = (Object) (value + suffix)संकलन क्यों करना चाहिए।
डुकलिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.