अन्य संबंधित प्रश्न हैं उदा। 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
प्रिंट करने के लिए पहली पंक्ति प्राप्त कर सकता हूं?
मैं वास्तव में आप क्या सुझाव दिया था, और आप सुनना तुम ठीक कह रहे unsurprised हो जाएगा: 2 फ़ाइलें बनाए गए हैं: MyClass $ 1DummyString.class MyClass $ 1DummyT.class MyClass.class और वे द्विआधारी-समान हैं यदि मैं लाइन 5 पर टाइप को लंबे समय तक बदलता हूं एफ इंटीजर। –
मैं कन्स्ट्रक्टर को कक्षा के उदाहरण को पारित करने के कामकाज/पैटर्न का आनंदपूर्वक उपयोग कर रहा हूं - मैं केवल उत्सुक था कि कम वर्बोज़ समाधान संभव था या नहीं। –