2013-09-27 7 views
5

यह क्यों हो रहा है। अगर मैं निर्धारण विधि टाइप करने के लिए अज्ञात जेनेरिक क्लास पास करता हूं - सब अच्छा है। लेकिन अगर मैं इस पद्धति में वस्तु पास - सांत्वना उत्पादन ईरनटाइम सामान्य प्रकार निर्धारण

public static void main(String[] args) { 

    printType(new ArrayList<Integer>() {}); 
    printType(new ArrayList<Integer>()); 

} 

public static void printType(final List<?> list) { 
    System.out.println(((ParameterizedType) list.getClass().getGenericSuperclass()).getActualTypeArguments()[0]); 
} 

कंसोल है:

class java.lang.Integer 

E 

कृपया मुझे समझा।

+0

आप क्या करने की कोशिश कर रहे हैं? –

+0

अच्छी तरह से आप अपनी सूची के टाइपपरमीटर को प्रिंट कर रहे हैं –

+0

मैं रनटाइम में प्रकार का पैरामीटर प्राप्त करने का प्रयास कर रहा हूं –

उत्तर

7

पहला आविष्कार ArrayList<Integer> के अज्ञात उप-वर्ग का उदाहरण गुजर रहा है। इसलिए, यह करने के लिए इसी तरह की है:

class YourClass extends ArrayList<Integer> 

और आप के रूप में विधि लागू: आपके मामले में YourClass के जेनेरिक सुपर क्लास या अनाम वर्ग

printType(new YourClass()); 

ArrayList<Integer> ही है। तो, वह आउटपुट स्पष्ट है।


आपके दूसरे मामले के लिए, आप ArrayList<Integer> का एक उदाहरण पास कर रहे हैं। और इस वर्ग की परिभाषा लगता है:

public class ArrayList<E> extends AbstractList<E> 
     implements List<E>, RandomAccess, Cloneable, java.io.Serializable 

तो, सामान्य सुपर क्लास यहाँ AbstractList<E> है।

सामान्य प्रकार शेयर एक ही Class उदाहरण के आरंभ होने:

ध्यान दें कि सभी ArrayList की इन्स्टेन्शियशन कार्यावधि में एक ही कक्षा का हिस्सा:

new ArrayList<Integer>().getClass() == new ArrayList<String>().getClass(); 

ऊपर तुलना आप true दे देंगे। दोनों क्योंकि getClass() मंगलाचरण तुम्हें वापस देता है:

class java.util.ArrayList 

JLS 8.1.2: Generic Classes and Type Parameters देखें:

एक सामान्य वर्ग घोषणा पैरामिट्रीकृत प्रकार का एक सेट को परिभाषित करता है (§4.5), प्रकार के प्रत्येक संभव मंगलाचरण के लिए एक पैरामीटर अनुभाग तर्क टाइप करके। इन सभी पैरामीटर प्रकारों को रन टाइम पर कक्षा साझा करें।

उदाहरण के लिए

, कोड को क्रियान्वित:

Vector<String> x = new Vector<String>(); 
    Vector<Integer> y = new Vector<Integer>(); 
    boolean b = x.getClass() == y.getClass(); 

चर b मूल्य true पकड़े का परिणाम देगा।

दूसरे शब्दों में, getGenericSuperClass() विधि आप वास्तविक प्रकार तर्क करते समय अपने वर्ग instantiating आप उपयोग करें, लेकिन प्रकार वर्ग यह प्रदान कर रहा है में इस्तेमाल किया पैरामीटर नहीं देंगे। अब, चूंकि java.util.ArrayList का सामान्य सुपरक्लास AbstractList<E> है। और इसलिए आपको प्राप्त प्रकार पैरामीटर केवल E होगा।

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