2013-10-08 2 views
11

मेरी परियोजना में प्रतिबिंब शामिल है और मैं वर्तमान में जेनेरिक प्रकारों से निपट रहा हूं। मैं एक सूची (java.util.List) से सामान्य प्रकार प्राप्त करने के लिए के साथ प्रबंधित किया है:जावा सामान्य प्रकार का संग्रह प्राप्त करता है

if(originalField.getGenericType() instanceof ParameterizedType){ 
    ParameterizedType pt = (ParameterizedType) originalField.getGenericType(); 
    Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0]; 
} 

मैं भी एक Collection<String> है और यह पता चला है कि संग्रह नहीं ParameterizedType लिए डाली जा सकती है।

किसी को पता है कि संग्रह से स्ट्रिंग (या जो कुछ भी होगा) कैसे प्राप्त करें?

मैं जावा मिरर के बारे में पढ़ रहा हूं इसलिए मुझे इसके बारे में पता है, लेकिन सूची से जेनेरिक प्राप्त करने के बाद, मैंने सोचा कि शायद कोई और 'चाल' जानता है।

धन्यवाद।

संपादित: मैं के साथ वर्ग के क्षेत्रों में से सब कुछ खत्म हो पुनरावृत्ति कर रहा हूँ:

for (Field originalField : someClass.getDeclaredFields()) 

और फिर जब मैं कुछ List<String> फील्ड का सामना करना पड़ रहा हूँ, इसके बाद के संस्करण कोड मैं उपवर्ग के रूप में String हो रही के साथ चर।

+1

आप कुछ और कोड दिखा सकते हैं हमारे फ़ील्ड के प्रकार के लिए कच्चे वर्ग को हल करने TypeResolver उपयोग कर सकते हैं। यह स्पष्ट नहीं है कि यहां क्या हो रहा है। यदि विधि 'सूची' के लिए काम करती है, तो कारण है कि यह 'संग्रह' के लिए काम नहीं करेगा। –

+0

भले ही आपको सामान्य प्रकार का क्षेत्र मिलता है, आप इसके साथ इतना कुछ नहीं कर सकते हैं। आपके मामले में क्या उद्देश्य है? –

+0

रोहित झोन - कोड सूची के लिए काम करता है लेकिन संग्रह के लिए नहीं। रनटाइम के दौरान यह कहा गया कि संग्रह पैरामीटरेट टाइप टाइप नहीं किया जा सकता है (जैसा कि मैंने प्रश्न में उल्लेख किया है)। सोटिरियस डेलिमैनोलिस - इस कोड का उद्देश्य कोड उत्पन्न करना है, इसलिए मैं जेनेरिक – Gumba

उत्तर

12

आपका दृष्टिकोण ठीक है। यह List<String> और Collection<String> दोनों के लिए काम करना चाहिए।

public class Demo { 

    List<String> list = new ArrayList<>(); 
    Collection<String> coll = new ArrayList<>(); 

    public static void main(String args[]){ 

     Class<Demo> clazz = Demo.class; 
     Field[] fields = clazz.getDeclaredFields(); 

     for (Field field: fields) { 

      Type type = field.getGenericType(); 

      if (type instanceof ParameterizedType) { 

       ParameterizedType pType = (ParameterizedType)type; 
       Type[] arr = pType.getActualTypeArguments(); 

       for (Type tp: arr) { 
        Class<?> clzz = (Class<?>)tp; 
        System.out.println(clzz.getName()); 
       } 
      } 
     } 
    } 
} 

इस बाहर प्रिंट:

java.lang.String 
java.lang.String 
1

जहां तक ​​मुझे पता है, जावा पूरी तरह से प्रकार को मिटा देता है, इसलिए संकलित कोड में आपके द्वारा पैरामीटर प्रकारों को आवंटित मान का कोई निशान नहीं है। सभी पैरामीट्रिक प्रकारों को कंक्रीट प्रकारों में अनुवादित किया जाता है, जिनमें टाइपिंग कास्टिंग और

कोड में मैंने अब तक देखा है, जब किसी वर्ग को अपने सामान्य प्रकार के मूल्य को जानने की आवश्यकता होती है, तो यह उस वस्तु को मजबूर करता है पैरामीटर के रूप में पारित करने के लिए प्रकार (या कक्षा) टाइप करें। कुछ की तरह:

class A<T> { 
    private final Class<T> parameterType; 

    public A(Class<T> parCls) { 
     parameterType = parCls; 
    } 

    public A(T tObj) { 
     parameterType = tObj.getClass(); 
    } 
} 
+0

जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मुझे जावा एरर से अवगत है, लेकिन मैंने सूची प्रकार से जेनेरिक प्राप्त करने के लिए प्रबंधित किया है (जैसा कि आप मेरे कोड में देख सकते हैं)। – Gumba

+0

वह प्रकार पैरामीटर है, न कि आपके द्वारा आवंटित मूल्य। –

0

आप ParameterizedType का उपयोग कर जो भी प्रकार उस पर परिभाषित किया गया था का समाधान करना होगा उदाहरण के लिए इस नमूना कोड देखें। उदाहरण के लिए, TypeTools का उपयोग कर:

class Foo<T> { 
    public T bar; 
} 

class StringFoo extends Foo<String> {} 

Type barType = Foo.class.getDeclaredField("bar").getGenericType(); 
Class<?> t = TypeResolver.resolveRawClass(barType, StringFoo.class); 
assert t == String.class; 

यहाँ T का मूल्य StringFoo में परिभाषित किया गया था, तो हम का उपयोग कर StringFoo

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