java - Calls to next() on abstract class that implements Iterator returns Object instead of E -
मेरे पास निम्न परिभाषा वाला एक वर्ग है:
सार्वजनिक सार वर्ग ए & lt; T & gt; इटरेटर & lt; B & gt; {} अगले कॉल करने के लिए निम्नलिखित कॉल (बी) की बजाय एक ऑब्जेक्ट लौटाएगी:
ए एक = नया कुछ somethingExtendsA (); बी बी = a.next (); मैंने थोड़ी देर के लिए खोज की है और यह समझने में सक्षम नहीं हैं कि यह अगली () कॉल क्यों संकलन करने में विफल रहता है। क्या कोई मेरे लिए इस व्यवहार का वर्णन करने में सक्षम है?
संपादित किए जाने वाले मूल को टेंप्लेट किया जा सकता है, जैसा कि इससे कोई फर्क पड़ता है।
अतिरिक्त स्पष्टीकरण के लिए संपादित करें: यह एक संकलन-समय का मुद्दा है, न कि एक रनटाइम मुद्दा SomethingThatExtendsA () के कार्यान्वयन; संकलित समय में इस मामले में अप्रासंगिक होना चाहिए।
इसलिए हमारे पास यह कोड है:
सार्वजनिक सार वर्ग ए & lt; T & gt; इटरेटर & lt; B & gt; {} [...] ए ए = नया सोथएटेंडेस ए (); a.next (); ए एक सामान्य प्रकार है, लेकिन आपने a एक कच्चे प्रकार के साथ परिभाषित किया है। = के दाहिने हाथ की ओर ध्यान न दें, हम केवल स्थिर प्रकार में रुचि रखते हैं: ए / * & lt; कुछ & gt; * / a = ...; संकलक आपको यहां चेतावनियां देना चाहिए। (जवाक के कम से कम अपेक्षाकृत नवीनतम संस्करण होंगे - कच्चे टाइप ओरेकल जवाक में चेतावनी।) अपने कंपाइलर की चेतावनियों का ध्यान रखें। (क्या यह अच्छा नहीं था जब जावैक ने चेतावनी नहीं दी?) तो अब हम ऐसी स्थिति में हैं कि a एक ऐसा प्रकार है जो कच्चा है और एक इटरेटर & lt; p & gt; । यह एक बहुत ही भ्रामक स्थिति है, जिसमें मन-बहसाने वाले मुश्किल निहितार्थ हैं। हमें यह भी नहीं करना चाहिए - हमें जेनेरिक और कच्चे प्रकारों के मिश्रण से बचा जाना चाहिए। तो जावा भाषा विशिष्टता सरल तरीके से बाहर ले जाती है और आंशिक जेनेरिक प्रकार की जानकारी को त्याग करती है। अतः, कच्चे और सामान्य प्रकारों का मिश्रण न करें बस सभी जेनेरिक का उपयोग करें और आपको ठीक होना चाहिए
Comments
Post a Comment