क्या उन दोनों के बीच अंतर है। उत्तरार्द्ध एक नई धारावाहिक कक्षा क्यों बनाते हैं? The serializable class does not declare a static final serialVersionUID field of type long
अंतर>() {}
उत्तर
पहले उदाहरण में, आप एक ArrayList
उदाहरण बना रहे हैं:
new ArrayList<Clazz>()
एक नया खाली ArrayList
new ArrayList<Clazz>(){}
ग्रहण से पता चलता पैदा करता है। उत्तरार्द्ध में आप ArrayList
के अज्ञात उप-वर्ग का उदाहरण बना रहे हैं। आमतौर पर आप subclass,
में एक या अधिक विधियों को ओवरराइड करेंगे अन्यथा ऐसा बनाने में बहुत अधिक बिंदु नहीं है।
जॉन स्कीट बताते हैं, एक सामान्य प्रकार के अज्ञात सबक्लास बनाने के लिए एक हैकी कारण है, his answer देखें।
The Eclipse कि चेतावनी देते हैं, आदेश Serializable
विनिर्देशों (ArrayList
Serializable
है, इसलिए अपने सभी उपवर्गों भी कर रहे हैं), तो आप एक अद्वितीय serialVersionUID
उपवर्ग में जहाँ से deserialization प्रक्रिया सुनिश्चित कर सकते हैं परिभाषित करना चाहिए का पालन करने में उस वर्ग परिभाषा धारावाहिक होने के बाद से महत्वपूर्ण रूप से नहीं बदला है (महत्वपूर्ण == आपने स्वयं निर्णय लिया है कि नई परिभाषा पुराने के साथ असंगत है, इसलिए आप serialVersionUID
को बदलकर इस तथ्य को व्यक्त कर सकते हैं)। यदि आप सूची को क्रमबद्ध करने के लिए कभी नहीं जा रहे हैं, तो चेतावनी कोई फर्क नहीं पड़ता।
Joonas कहते हैं, दूसरे उदाहरण में आप एक गुमनाम आंतरिक वर्ग बना रहे हैं। हालांकि, ऐसा करने का एक कारण है जब भी आप किसी भी तरीके से ओवरराइड नहीं कर रहे हैं आदि: यह आपको निष्पादन समय पर ArrayList
के तत्व प्रकार को निर्धारित करने की अनुमति देता है - क्योंकि अनाम आंतरिक कक्षा का सुपरक्लास केवल ArrayList<Clazz>
है ArrayList
।
यह कैसे प्रकार शाब्दिक Guice में काम करते हैं। यह एक बदसूरत हैक का एक सा है, लेकिन यह काम किया ...
यह उसे रनटाइम पर तत्व प्रकार निर्धारित करने की अनुमति कैसे देता है? –
@LouisRhys: यदि आप उदाहरण पर 'getClass()' कहते हैं, तो यह अनाम वर्ग देगा। यदि आप 'getGenericSuperclass()' को कॉल करते हैं तो 'टाइप' में उपयुक्त जानकारी होगी। –
बेनामी उपवर्ग हो जाता है। मैं इतना अंधा क्यों था .. –