2009-05-26 15 views
9

में क्षेत्र में सामान्य वहाँ एक पैरामीटर के लिए निर्माण में में पारित सामान्य पैरामीटर प्रकार स्टोर करने के लिए कोई तरीका है। मेरा लक्ष्य:स्टोर वर्ग जावा

class generic<T> { 
    Class<T> type; 
    public generic() { 
     super(); 
     this.type = //Something that gets class from T 
    } 
} 

यह क्या मैं वर्तमान में कर रहा हूँ है:

class generic<T> { 
    Class<T> type; 
    public generic(Class<T> type) { 
     super(); 
     this.type = type; 
    } 
} 

यह वर्ग दो बार निर्दिष्ट करने के लिए मूर्खतापूर्ण लगता है, लेकिन मैं इसे और कैसे करने के लिए के बारे में सुनिश्चित नहीं हूँ। मुझे लगता है कि यह प्रतिबिंब के साथ संभव हो सकता है, लेकिन मैंने अभी तक इसकी जांच नहीं की है। क्या कोई और सरल तरीका है? यदि नहीं (एक तरफ के रूप में) सूचना हानि क्यों?

+0

आप जेनरिक, आप क्यों चाहते हैं/उपयोग कर रहे हैं वर्ग की ज़रूरत है? इसमें एक अजीब गंध है। – Instantsoup

+0

सहमत, आप क्रम में सामान्य पैरामीटर के लिए उपयोग की जरूरत नहीं चाहिए, क्योंकि जेनरिक केवल एक संकलन प्रकार विशेषता है ... –

उत्तर

10

जावा जेनरिक Type Erasure

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

3

मुझे लगता है कि आप इसे type erasure की वजह से नहीं कर सकते।

3

वे टाइपटाइम पर संरक्षित नहीं हैं, इसलिए आप इसे पैरामीटर के रूप में नहीं ले सकते हैं। जावा में जेनेरिक सख्ती से एक संकलन-समय अवधारणा है (पिछड़ा संगतता कारणों के लिए)। इसे Type Erasure कहा जाता है।

क्लास ऑब्जेक्ट एक प्रकार पैरामीटर लेता है, इस समस्या के आसपास काम करना ठीक है, इसलिए आप क्लास ऑब्जेक्ट को प्रोग्राम प्रकार के रूप में प्रस्तुत करने के लिए ले सकते हैं।

8

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

final class Generic<T> { 
    private final Class<T> type; 
    private Generic(Class<T> type) { 
     super(); 
     if (type == null) { 
      throw new NullPointerException(); 
     } 
     this.type = type; 
    } 
    public static <T> Generic<T> newInstance(Class<T> clazz) { 
     return new Generic<T>(clazz); 
    } 
} 
... 
    someFunction(Generic.newInstance(SomeType.class)); 
बेशक

, यदि आप एक चर में परिणाम संग्रहीत करना चाहते हैं, तो आप शायद वैसे भी प्रकार को दोहराने के लिए जा रहे हैं!

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