2017-08-02 128 views
0

我的代碼片段。如何爲java.lang.reflect.Array.newInstance傳遞泛型類型?

public class GenericArray <T extends Comparable<T>>{ 
    private T[] a; 
    private int nElems; 
    public GenericArray(int max) // constructor 
    { 
     a=(T[])java.lang.reflect.Array.newInstance(Integer.class, max); 
     //Hard coded for Integer. 
    } 
} 

GenericArray arr= new GenericArray<Integer>(100); 

這工作,因爲我實例化顯式傳遞Integer.class。我如何使它成爲通用的?

或 有沒有辦法打印使用ParameterizedType傳遞給GenericArray的類型信息?

回答

2

因爲類型擦除,您需要將Class<T>通過在構造函數的參數(如果我得到的可能,我想如果報表處理使用),如

public GenericArray(Class<T> cls, int max) // constructor 
{ 
    a = (T[]) java.lang.reflect.Array.newInstance(cls, max); 
} 

並把類的構造函數和在使用時請勿使用raw type。也就是說,

GenericArray<Integer> arr = new GenericArray<>(Integer.class, 100); 
+0

謝謝。完善。爲此,如何打印我正在打印的類型類?我試過System.out.println(((ParameterizedType)getClass()。getGenericSuperclass())。getActualTypeArguments()[0] .getClass()。getCanonicalName()); – sunhara

-1

你可以通過喜歡的類型參數類:

GenericArray<String, Integer> myobj = new GenericArray<>(「John」,2); 

或者

考慮這樣的通用方法顯示(),它接受一個數組參數給定的代碼作爲它的論據。

class GenericArray <T extends Comparable<T>> 
    {  
    public<T> display(T[] val) {  
    for(T element : val)  
    {    
    System.out.printf(「Values are: %s 「 , element);  
    } 
    } 
    // Declaring Array 
    GenericArray[] intValue = {1, 7, 9, 15};     
    GenericArray<Integer> listObj = new GenericArray<>(); 
    // Passing Array values    
    listObj.display(intValue); 

同樣,你可以用兩個類型參數聲明一個類。