2009-01-20 13 views
5

विचार बेस क्लास को परिभाषित करना है जो व्युत्पन्न कक्षाओं में परिभाषित विधियों का आह्वान कर सकता है, लेकिन सृजन के समय मैं यह सुनिश्चित करना चाहता हूं कि इस तरह के तरीकों को आवश्यकताओं के अनुसार बिल्कुल परिभाषित किया गया है, यह है कि विधियां केवल एक तर्क लेती हैं, एक हैश मैप <String String>।जावा: सामान्य वर्ग प्रकार परिभाषाओं को कैसे जांचें?

अब तक मैं यह जांचने के लिए निम्न कोड में सक्षम था कि विधि में केवल एक पैरामीटर है और यह क्लास हैश मैप का है, लेकिन मैं कैसे जांच सकता हूं कि जेनेरिक परिभाषा <String, String> है?

public boolean isMethodParameterValid(final Method method) { 
    final Class<?>[] parameters = method.getParameterTypes(); 
    return ((parameters.length == 1) && parameters[0].isAssignableFrom(HashMap.class)); 
} 

उत्तर

7

आप नहीं कर सकते। जावा जेनेरिक प्रकार कंपाइलर द्वारा "मिटाए गए" हैं, यानी HashMap<String, String> रन-टाइम पर केवल HashMap बन जाता है। this प्रश्न देखें।

+1

सभी प्रकार मिटाए नहीं गए हैं। एक और उदाहरण 'नया ऐरेलिस्ट {} 'होगा। नील Gafter के सुपर टाइप टोकन पोस्ट भी पढ़ने के लायक है: http://gafter.blogspot.com/2006/12/super-type-tokens.html – johnstok

+0

नहीं, गल्स के सुपर टाइप टोकन को संकलित समय पर मिटा दिया गया है। उनकी चाल जेनेरिक को चालू करने के लिए प्रयुक्त प्रकार तक पहुंचने में मदद करती है, रनटाइम पर (क्योंकि Type.getClass() अधिकृत है)। – JVerstry

1

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

1

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

एक कारण तुम सिर्फ खाका पैटर्न में के रूप में एक सार विधि को परिभाषित कर सकते है?

फिर जांच स्थाई रूप से की जाएगी।

protected abstract void process(HashMap<String, String>); 

(भी वहाँ पर सिर्फ मानचित्र HashMap की आवश्यकता के लिए एक कारण है?)

12

दरअसल, वहाँ प्रकार विलोपन है लेकिन यह/क्षेत्रों चर करने के लिए लागू नहीं है - केवल वर्गों की परिभाषा जहां प्रकार पैरामीटर के लिए मिटा दिया गया है और उनकी ऊपरी सीमाओं के साथ बदल दिया गया है।

इसका मतलब है कि आप जो पूछ रहे हैं वह हासिल किया जा सकता है। यहां बताया गया है कि आप विधि के पहले पैरामीटर के सामान्य पैराम का निरीक्षण कैसे कर सकते हैं:

class Z 
{ 
    public void f(List<String> lst) { } 
} 

... 

Method m = Z.class.getMethod("f", List.class); 
Type t = m.getGenericParameterTypes()[0]; 
if(t instanceof ParameterizedType) { 
    ParameterizedType pt = (ParameterizedType) t; 
    System.out.println("Generic params of first argument: " + Arrays.toString(pt.getActualTypeArguments())); 
}  
+0

हाँ। यदि आपके पास रनटाइम पर कक्षा का उदाहरण है, तो आप इसके सामान्य प्रकार के पैरामीटर के लिए यह नहीं पूछ सकते हैं। यदि आपके पास जेनेरिक टाइप पैरामीटर के साथ परिभाषित किए गए किसी विधि, वर्ग या फ़ील्ड पर प्रतिबिंबित हैंडल है, तो आप यह निर्धारित करने के लिए प्रतिबिंब विधियों का उपयोग कर सकते हैं कि वे सामान्य पैरामीटर क्या हैं - चाहे वे प्रकार हैं, वाइल्डकार्ड, प्रकार चर, आदि। – pholser

संबंधित मुद्दे