2011-09-08 12 views
5

हैलो मेरे पास एक तरीका है जो प्रकार के आधार पर अलग-अलग परिणाम लौटाएगा।जेनेरिक का उदाहरण जांचें?

मैं सामान्य प्रकार की जांच करने के लिए ऐसा कर सकता हूं।

public <T> T search(final String query){ 
T returnValue = null; 
if (returnValue instanceof String){ } 
if (returnValue instanceof Integer){ } 
if (returnValue instanceof MyObject){ } 

लेकिन मैं ऐसा क्यों नहीं कर सकता?

public <T> T search(final String query){ 
T returnValue = null; 
if (T instanceof String){ } 
if (T instanceof Integer){ } 
if (T instanceof MyObject){ } 

कॉलिंग कोड।

String id = myObjcet.<String> search("select ..."); 

उत्तर

4

जावा "मिटाकर" जेनरिक लागू करता है। इसका मतलब है कि रनटाइम पर (लगभग) जेनेरिक का कोई ज्ञान नहीं है। इसके बजाए, जेनेरिक के लिए कंपाइलर जांच करता है, लेकिन कवर के तहत यह ऑब्जेक्ट (या निकटतम जेनेरिक सीमा तक) में सब कुछ बदल देता है।

आपको लगता है कि विधि डिकंपाइल javap का उपयोग कर रहे हैं, तो आप देखेंगे कि इसे पढ़ता है:

public Object search(... 

टी करने के लिए हर संदर्भ हटा दिया है।

ऐसा जैसी निर्माणों के साथ JRE कक्षाओं में अक्सर भी देखा जा सकता है जावा, में जेनरिक की एक गंभीर सीमा है:

SomeClass<String> x = new SomeClass<String>(String.class); 

कहाँ स्ट्रिंग (String.class) के तीसरे पुनरावृत्ति क्योंकि निर्माता की जरूरत है यह जानने की जरूरत है कि यह किस वर्ग पर चल रहा है।

यह प्रतिमान, भयानक होने के बावजूद, आपकी समस्या का समाधान कर सकता है।

जेनिक्स के बारे में जानकारी वास्तव में .class फ़ाइलों में मेटाडेटा के रूप में निहित हैं, इन्हें प्रतिबिंब का उपयोग करके निरीक्षण किया जा सकता है और कुछ हद तक हल किया जा सकता है। हालांकि, यह आपके जैसे किसी मामले में संभव नहीं है, लेकिन उदाहरण के लिए यह सूची प्राप्तकर्ताओं पर ओआरएम द्वारा उपयोग किया जाता है।

public List<Group> getGroups() { 

हाइबरनेट द्वारा निरीक्षण किया जा सकता है इतना है कि यह जानता है कि सूची समूह के उदाहरण धारण करने के लिए, उसके अनुसार अपना प्रश्नों अनुकूल माना जाता है: उदाहरण के लिए, हाइबरनेट, इस तरह की एक गेटर का उपयोग कर।

(हालांकि, जेनिक्स जहां इस तरह से लागू नहीं किया गया है, टी भी एक उदाहरण नहीं है, यह एक वर्ग है, स्ट्रिंग उदाहरण स्ट्रिंग का लेखन समान रूप से गलत है। यह होना चाहिए (टी .equals (String.class))

+0

इस शानदार स्पष्टीकरण के लिए बहुत बहुत धन्यवाद, जैसे ही एसओ मुझे अनुमति देता है, मैं आपको जवाब दूंगा। – Farmor

1

क्योंकि T रनटाइम पर मिटा दिया गया है। यह केवल संकलन समय पर है। returnValue चर है - यह रनटाइम पर मौजूद है।

1
public <T> T search(Class<T> clazz, String query){ 
T returnValue = null; 
if (clazz==String.class){ } 
if (clazz==Integer.class){ } 
if (MyObject.clazz.isAssignableFrom(clazz){ } 


String id = myObjcet.search(String.class, "select ..."); 
संबंधित मुद्दे