2016-03-17 3 views
13

मेरा मतलब है, क्या इसके लिए कोई अच्छा कारण है?क्यों Array.newInstance (कक्षा <?>, int) सामान्य नहीं है?

public static Object newInstance(Class<?> componentType, 
       int length) 
          throws NegativeArraySizeException 

मेरी राय में, यह बहुत अधिक convinient होगा इस प्रकार प्रणाली की घोषणा करने के लिए: method के निम्नलिखित हस्ताक्षर मिला

public static <T> T[] newInstance(Class<T> componentType, int length) 
              throws NegativeArraySizeException 

इस तरह, सामान्य प्रकार का एक aray बनाते समय अतिरिक्त कास्टिंग करने के लिए यह निष्पक्ष नहीं होगा, उदाहरण के लिए

public class Gen<T>{ 
    private T[] a; 

    public static <T> Gen<T> createByClass(Class<T> clazz){ 
     a = clazz.cast(Array.newIntance(clazz.getComponentType(), 8); //we have to invoke 
                     //clazz.cast here. 
    } 
} 

वहाँ किसी भी अच्छा Object के रूप में वापसी मान प्रकार की घोषणा करने के कारण था? मेरे लिए यह बहुत ही कमजोर लगता है।

+5

सबसे पहले, मुझे संदेह है कि यह जेनेरिकों की भविष्यवाणी करता है। दूसरा, मुझे यकीन नहीं है कि 'int.class' आदि के लिए क्या होगा। –

+0

@ जोन्स स्केट' int.class' का उल्लेख करते समय आपका क्या मतलब है? मैंने सोचा था कि प्राइमेटिव्स के क्लास ऑब्जेक्ट्स का अनुरोध हमेशा उनके संदर्भ रैपर क्लास ऑब्जेक्ट को देता है ... –

+2

नहीं, निश्चित रूप से नहीं - अगर आप 'Array.newInstance (int.class, 5) कहते हैं, तो आपको' int [] 'वापस मिल जाएगा , एक 'इंटीजर [] 'नहीं। –

उत्तर

12

आप Array.newInstance(Class<?> componentType, int length) का उपयोग वस्तुओं की

  • सरणी बनाने के लिए कर सकते हैं: int[][] c = (int[][])Array.newInstance(b.getClass(), 5);
: सरणी की int[] b = (int[])Array.newInstance(Integer.TYPE, 5);
  • सरणी: Integer[] a = (Integer[])Array.newInstance(Integer.class, 5);
  • पुरातन के एरे 210

    दूसरा उदाहरण दिखाता है कि यह विधि केवल वस्तुओं की जेनेरिक सरणी क्यों नहीं लौटा सकती है, क्योंकि प्राइमेट्स के सरणी ऑब्जेक्ट्स की सरणी नहीं हैं (दूसरी ओर, सरणी के सरणी हैं) हैं।

    इस सहायक पद्धति का उपयोग करना ...

    private static <T> T[] newArray(Class<?> type, int len){ 
        return (T[])Array.newInstance(type, len); 
    } 
    

    ... int[] b = newArray(Integer.TYPE, 5); के साथ एक संकलन त्रुटि में परिणाम होगा:

    Incompatible types, required int[], but found T[]

    ... और int[] b = (int[])newArray(Integer.TYPE, 5); के साथ एक संकलन त्रुटि में परिणाम होगा:

    cannot cast Object[] to int[]

  • +0

    दरअसल, इसे मिला। –

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