2011-03-25 14 views
7

मेरी कक्षा के वर्ग कोड मैं H.class लिखना चाहते हैं में अब कहींजाओ सामान्य

public abstract class LastActionHero<H extends Hero>(){ 

साथ शुरू होता है, लेकिन यह संभव नहीं है (जैसे String.class या Integer.class है)।

क्या आप मुझे बता सकते हैं कि मैं जेनेरिक के Class कैसे प्राप्त कर सकता हूं?

उत्तर

7

आप गतिशील रूप से प्रकार प्रदान कर सकते हैं, हालांकि संकलक स्वचालित रूप से आपके लिए यह नहीं करता है।

public abstract class LastActionHero<H extends Hero>(){ 
    protected final Class<H> hClass; 
    protected LastActionHero(Class<H> hClass) { 
     this.hClass = hClass; 
    } 
    // use hClass how you like. 
} 

बीटीडब्ल्यू: यह गतिशील रूप से प्राप्त करना असंभव नहीं है, लेकिन यह इस बात पर निर्भर करता है कि इसका उपयोग कैसे किया जाता है। उदाहरण के लिए

public class Arnie extends LastActionHero<MuscleHero> { } 

यह निर्धारित करना संभव है कि Arnie.class में MuscleHero के जेनेरिक पैरामीटर के साथ एक सुपर क्लास है।

public class Arnie<H extend Hero> extends LastActionHero<H> { } 

सुपर वर्ग के सामान्य पैरामीटर सिर्फ H इस मामले में हो जाएगा।

0

आप नहीं कर सकते- प्रकार रन-टाइम पर मिटा दिया गया है और केवल संकलन समय पर मौजूद है।

2

एक तरह से

private Class<H> clazz; 

की एक विशेषता होने की तरह अपने पैरामिट्रीकृत प्रकार के संदर्भ में रखने के लिए और एक सेटर या एक निर्माता है कि एक Class<H> में ले जाता है बनाने के लिए है।

पैरामीटरेटेड प्रकार रनटाइम पर मिटा दिए जाते हैं, इसलिए आप जो भी पूछते हैं वह नहीं कर सकते हैं।

15

हम निम्नलिखित तरीके से कार्य करें: http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil.java

के लिए:

public abstract class LastActionHero<H extends Hero>() { 
    Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.class, this.getClass()).get(0); 
} 

आपको यह फ़ाइल से दो कार्यों की जरूरत है:

private Class<T> persistentClass; 

    public Class<T> getPersistentClass() { 
     if (persistentClass == null) { 
      this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
     } 
     return persistentClass; 
    } 
संबंधित मुद्दे