2010-08-19 8 views
6

मेरे पास पैरामीटरयुक्त क्लास है:मैं एक सामान्य वर्ग के वास्तविक प्रकार तर्क कैसे सीख सकता हूं?

class ParameterizedClass<T extends AbstractSomething> { 
} 

कॉलिंग:

new ParameterizedClass<Something>(); 

तो जावा जेनिक्स का उपयोग करके मैं T का वास्तविक प्रकार कैसे प्राप्त कर सकता हूं?

उत्तर

9

यह किया जा सकता है, लेकिन type erasure इसे बहुत कठिन बना सकता है। जैसा कि अन्य उत्तरों पर चर्चा है, आपको या तो ParameterizedClass का सबक्लास बनाना है या TParameterizedClass पर फ़ील्ड जोड़ें, और प्रतिबिंब कोड जो आपको करने की आवश्यकता है उसे समेकित किया गया है।

:

स्थिर तरीकों के लिए जावा के प्रकार निष्कर्ष के कारण
class ParameterizedClass<T> { 
    private Class<T> type; 

    /** Factory method */ 
    public static <T> ParameterizedClass<T> of(Class<T> type) { 
     return new ParameterizedClass<T>(type); 
    } 

    /** Private constructor; use the factory method instead */ 
    private ParameterizedClass(Class<T> type) { 
     this.type = type; 
    } 

    // Do something useful with type 
} 

, आप बहुत ज्यादा अतिरिक्त बॉयलरप्लेट के बिना अपने वर्ग का निर्माण कर सकते हैं:

मैं इन परिस्थितियों में क्या सलाह देते हैं, इस तरह समस्या के समाधान के लिए है

ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class); 

इस तरह, आपका ParameterizedClass पूरी तरह से सामान्य और प्रकार-सुरक्षित है, और आपके पास अभी भी क्लास ऑब्जेक्ट तक पहुंच है।

संपादित: टिप्पणी संबोधित

+0

बढ़ाता है *** यह *** संभव है। यह जवाब गलत है। समाधान का दूसरा उत्तर जांचें। –

+0

@AdamArold मुझे तब तक पता नहीं था जब मैंने जवाब लिखा था, लेकिन आप सही हैं। हालांकि, मैं अभी भी इसकी अनुशंसा नहीं करता हूं। मैंने तदनुसार अपना जवाब अपडेट कर लिया है। – jqno

8

आप अपने निर्माता में इस चाल इस्तेमाल कर सकते हैं: (http://www.hibernate.org/328.html देख)

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

लेकिन मेरा मानना ​​है कि इस कोड को केवल काम करता है जब वर्ग उप वर्गीकृत है और उप-वर्ग का एक उदाहरण यह निष्पादित करता है।

+0

मुझे यह चाल पता है और डीएओ कक्षाओं पर उपयोग कर रहा हूं। लेकिन यह वह नहीं है जो मैं देख रहा हूं। इस चाल का उपयोग करने के लिए, मुझे लगता है, हमें स्रोत कोड पर जेनेरिक प्रकार के मूल वर्ग के वास्तविक मूल्य को परिभाषित करना होगा। जेनेरिकडाओ <टी मॉडल बढ़ाता है> उपयोगकर्तादाओ जेनेरिकडाओ TanerDiler

3

यदि आप केवल वस्तु से ही हैं, तो आप नहीं कर सकते हैं। टाइप मिटाएं का अर्थ है कि जानकारी गुम हो गई है।

आप एक क्षेत्र जो हालांकि एक ठोस प्रकार तर्क के साथ पैरामिट्रीकृत प्रकार का उपयोग करता, कि जानकारी संरक्षित है है।

Angelika Langer's Generics FAQ देखें, और विशेष रूप से section on type erasure देखें।

0

के बाद से यह केवल विशेष परिस्थितियों में काम करता है उम्मीद की तरह (expecially जटिल स्थितियों में) यह एक ज्यादातर समस्याग्रस्त विषय है।

लेकिन ज़ेबिया ने पूरी चीज़ पर good article प्रकाशित किया।

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