2011-11-04 14 views
5

अन्य संबंधित प्रश्न हैं उदा। 6624113, 3403909, 4516891 लेकिन मेरा प्रश्न सरल और अधिक विशिष्ट है।एक सामान्य संदर्भ में getActualTypeArguments का उपयोग

मैं रनटाइम पर जानना चाहता हूं कि किस प्रकार मेरी कक्षा को पैरामीटर किया गया था - मुझे टाइप पैरामीटर के प्रकार का क्लास ऑब्जेक्ट चाहिए। टाइप एरर के कारण, T.class अभिव्यक्ति काम नहीं करती है, और इसे पाने के लिए typeof(T) जैसे कोई फ़ंक्शन नहीं है।

हालांकि, ParameterizedType और संबंधित कक्षाओं के माध्यम से कुछ "उबर-प्रतिबिंब" उपलब्ध है, जो मुझे लगभग सभी तरह से प्राप्त करता है।

import java.lang.reflect.ParameterizedType; 

public class MyClass<T> { 
    public static void main(String[] args) { 
     new MyClass<Integer>().printTypeParam(); 
    } 

    public void printTypeParam() { 
     class DummyT extends MyClass<T> {} 
     class DummyString extends MyClass<String> {} 

     ParameterizedType ptT = 
      ((ParameterizedType) DummyT.class.getGenericSuperclass()); 

     ParameterizedType ptString = 
      ((ParameterizedType) DummyString.class.getGenericSuperclass()); 

     System.out.println("DummyT: " + ptT + " " + ptT.getActualTypeArguments()[0]); 
     System.out.println("DummyString: " + ptString + " " + ptString.getActualTypeArguments()[0]); 

    } 
} 

मैं इस उत्पादन को देखने जब मैं ऊपर चलाएँ:

DummyT: MyClass<T> T 
DummyString: MyClass<java.lang.String> class java.lang.String 

आप देख सकते हैं, इस प्रकार जब तर्क कॉल युक्त कोड की पंक्ति में संकलन समय पर जाना जाता है के लिए काम करता है getGenericSuperClass पर, लेकिन जहां वह कॉल जेनरिक्स से निपट रही है, यह केवल प्रकार पैरामीटर के नाम को प्रिंट करती है।

क्या कोई तरीका है कि मैं T के बजाय java.lang.Integer प्रिंट करने के लिए पहली पंक्ति प्राप्त कर सकता हूं?

उत्तर

3

आप सादा और सरल नहीं कर सकते हैं। Integer को संशोधित नहीं किया गया है, यह पूरी तरह से erased है। यदि आप मुझ पर विश्वास नहीं करते हैं, तो Integer के साथ फ़ाइल को संकलित करें और एक बार Long के साथ। दो बाइनरी कक्षा फाइलें बिल्कुल समान होंगी।

टाइप एरर एक कठोर वास्तविकता है कि आप चारों ओर नहीं पहुंच पाएंगे। मेरा सुझाव है कि आप से बचने के लिए हैक शुरू करने के पथ को नीचे जाने के बजाय की आवश्यकता है।

उपयोगी AngelikaLanger जेनेरिक्स पूछे जाने वाले प्रश्न विषय:

+1

मैं वास्तव में आप क्या सुझाव दिया था, और आप सुनना तुम ठीक कह रहे unsurprised हो जाएगा: 2 फ़ाइलें बनाए गए हैं: MyClass $ 1DummyString.class MyClass $ 1DummyT.class MyClass.class और वे द्विआधारी-समान हैं यदि मैं लाइन 5 पर टाइप को लंबे समय तक बदलता हूं एफ इंटीजर। –

+0

मैं कन्स्ट्रक्टर को कक्षा के उदाहरण को पारित करने के कामकाज/पैटर्न का आनंदपूर्वक उपयोग कर रहा हूं - मैं केवल उत्सुक था कि कम वर्बोज़ समाधान संभव था या नहीं। –

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