2015-06-25 237 views
2

我有一個泛型類的類。 import java.lang.reflect.Array;獲取泛型類型的數組類

public abstract class MyClass<T> { 

    private Class<T> clazz; 
    private Class<?> arrayClazz; 

    public MyClass() { 
     clazz = ClassUtils.getParameterizedClass(getClass()); 
     arrayClazz = Array.newInstance(clazz, 0).getClass(); 
    } 
} 

Utils方法讀取給定類的泛型類型,因此我不必將相同的類作爲構造函數參數傳遞。我想要實現的是獲得clazz數組類。

例如,如果T是字符串然後

clazz = String.class; 
arrayClazz = String[].class; 

我目前通過創建T []的新實例並讀取其類解決它。我想知道是否有更好的方法,或者這種方法有什麼缺點。

更新

我想要做的事:我有一個通用的DataProvider從服務器請求JSON。我使用GSON來解析響應。

public abstract class DataProvider<T> { 

    private final Class<T> resourceClass; 
    private final Class arrayClass; 


    protected DataProvider() { 
     this.resourceRootPath = resourceRootPath; 
     this.resourceClass = ClassUtils.getParameterizedClass(getClass()); 
     arrayClass = Array.newInstance(resourceClass, 0).getClass(); 
    } 

    public void get(String id) { 
     ... 
     T obj = gson.fromJson(response.body().charStream(), resourceClass) 
     ... 
    } 

    public void list(String id) { 
     ... 
     T[] objs = gson.fromJson(response.body().charStream(), arrayClass) 
     ... 
    } 
} 
+0

你想做什麼? 你爲什麼試圖獲取數組類型的參數類型?如果你想保存一個T類型元素的集合,爲什麼不創建一個字段'List list;'並實例化它?沒有魔法需要。 :-) – Buurman

+0

@SotiriosDelimanolis我很確定它的工作原理。我沒有寫,所以我不能分享它。 –

+0

@Buurman我更新了問題來解釋我在做什麼。希望它能澄清一點。 –

回答

1

您應該查看Type Erasure,這可能會阻止乾淨的方式做你想要的東西。 (泛型不能幫助你。)

問題是,在Java中,通用類型數據在編譯時使用,以確保一切看起來不錯......然後Java完全忘記了它。這些類型沒有按照你希望的方式進行編譯,他們只是走了。

因此,您的方法是(我認爲!)最乾淨的,即使它感覺哈克。你需要實例化一個並使用反射來獲得它的類型。

+0

謝謝,我現在瞭解泛型更好一點。我不知道他們被編譯爲Object。這就是爲什麼一些解決方案在http://stackoverflow.com/questions/13392160/about-java-get-string-class-from-string-class-what-if-string-class-is不工作。所以我會堅持我的解決方案。 –