जेनरिक के साथ रनटाइम प्रकार की जाँच के दो विकल्प:
विकल्प 1 - अपने निर्माता को भ्रष्ट करें
मान लेते हैं कि आप indexOf (...) को ओवरराइड कर रहे हैं, और आप केवल प्रदर्शन के लिए प्रकार की जांच करना चाहते हैं, अपने आप को संपूर्ण संग्रह को पुन: सहेजने के लिए।
इस तरह से गंदे निर्माण करें:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
फिर आप प्रकार की जांच करने के लिए isAssignableFrom का उपयोग कर सकते हैं ।
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
हर बार जब आप अपनी वस्तु को पलटाते हैं तो आपको खुद को दोहराना होगा:
new MyCollection<Apples>(Apples.class);
आप यह तय कर सकते हैं कि यह इसके लायक नहीं है। ArrayList.indexOf (...) के कार्यान्वयन में , वे जाँच नहीं करते हैं कि प्रकार मेल खाता है।
विकल्प 2 - इसे विफल होने दें
यदि आपको एक अमूर्त पद्धति का उपयोग करने की आवश्यकता है जिसमें आपके अज्ञात प्रकार की आवश्यकता होती है, तो आप वास्तव में चाहते हैं कि संकलक के लिए उदाहरण के बारे में रोना बंद हो । यदि आपके पास इस तरह की विधि है:
protected abstract void abstractMethod(T element);
आप इसे इस तरह से उपयोग कर सकते हैं:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
आप ऑब्जेक्ट को टी (आपके जेनेरिक प्रकार) में डाल रहे हैं, बस संकलक को मूर्ख बनाने के लिए। आपकी कास्ट रनटाइम पर कुछ भी नहीं करती है , लेकिन आप तब भी एक क्लासकैस्टैसेप्शन प्राप्त करेंगे जब आप गलत प्रकार की वस्तु को अपने अमूर्त तरीके से पास करने की कोशिश करेंगे।
नोट 1: यदि आप अपनी सार पद्धति में अतिरिक्त अनियंत्रित जातियाँ कर रहे हैं, तो आपकी ClassCastException यहाँ पकड़ी जाएगी। यह अच्छा या बुरा हो सकता है, इसलिए इसके माध्यम से सोचें।
नोट 2: जब आप Instof का उपयोग करते हैं तो आपको एक निशुल्क चेक मिलता है । चूंकि आप इसका उपयोग नहीं कर सकते हैं, इसलिए आपको अपने नंगे हाथों से नल की जांच करने की आवश्यकता हो सकती है।
Class.isAssignableFrom
।