2013-10-30 34 views
5

我有這將返回基於類的類型的自定義類型的靜態方法的對象,如何獲得類通用型

public class GenericMethod { 

    public static <T> T returnGeneric(Class<T> clazz) { 
     return null; 
    } 

} 

現在,我想通過一類具有通用鍵入它,

CustomType<String> type = GenericMethod.returnGeneric(CustomType.class); 

唯一的問題是,上述語句給出和未經檢查的轉換警告。

我試着解決方法new CustomType<String>().getName()這也沒有解決問題。

有沒有正確的方法,或唯一的解決方案是使用@SuppressWarnings

+1

可能重複:http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime? – benzonico

回答

1

你會怎樣/想試試這個是:

CustomType<String> type = GenericMethod.returnGeneric(CustomType<String>.class); 

不幸的是,因爲類型擦除有CustomType<A>.classCustomType<B>.class沒有什麼區別,因此這句法不支持Java。

所以我的$ .02:你所要求的是不可能的,所以掛到@SuppressWarnings ...

+0

嘗試編譯它。 –

+0

正如我所說:「因此Java不支持此語法」 – GerritCap

+0

您正在修改答案,然後鍵入正確的評論。 –

1

最好的方法是使用包裝方法,並把所有的警告,在一個單一的地點。

而「unchecked」一詞表示編譯器沒有足夠的類型信息來執行所有必需的類型檢查以確保類型安全。

0

理論上你不能這樣做是因爲類型擦除。

在實踐中雖然;)你可以這樣做,因爲信息實際上在.class文件中。 我知道的最簡單的方法是using Spring's GenericTypeResolver

看看它。

+0

理論與實踐沒有區別。你誤解了什麼類型的擦除是。而類的元數據與這個問題無關。 – newacct

0

正如你所說@Simeon「理論上你不能這樣做是因爲類型擦除」。 你可以使用它只有當你有CustomType子類:

class GenericMethod { 

    public static <T> T returnGeneric(Class<T> clazz) { 
    try { 
     return clazz.newInstance(); 
    } catch (InstantiationException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return null; 
    } 

    public static void main(String [] args){ 
    CustomeType<String> ct = returnGeneric(StringCustomeType.class); 
    System.out.println(ct); 
    } 
} 

class StringCustomeType extends CustomeType<String> { 
} 

class CustomeType<T> { 
}