[英]Get “Class” object from generic type T
我想制作返回 XML 文檔的對象表示的通用函數(使用 JAXB)。 我需要將“類”對象傳遞給 JAXBContext 構造函數,但是如何從 T 獲取它?
public <T> readXmlToObject(String xmlFileName, T jaxbClass) {
JAXBContext context = JAXBContext.newInstance(T.class); // T.class - here error, how to get it?
.......
}
改為傳遞類對象,這很容易。
public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) {
JAXBContext context = JAXBContext.newInstance( jaxbClass ); // T.class - here error, how to get it?
Object o = context.createUnmarshaller().unmarshal( new File( xmlFileName ) );
return jaxbClass.cast( o );
}
這里的想法是,由於您無法從對象中提取類型參數,因此您必須以相反的方式進行:從類開始,然后操作對象以匹配類型參數。
不要聽別人的...你可以得到它。
只需將jaxbClass
參數的類型更改為Class<T>
:
public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) {
JAXBContext context = JAXBContext.newInstance(jaxbClass);
.......
}
您無法在運行時獲得 的類。 Java 使用類型安全擦除來實現泛型,這意味着對泛型類型的理解只能通過編譯來應用。 如果你想獲得它的類,你必須在運行時詢問實際的對象。
看看這個 SO 答案。
基本上,類型 T 在運行時不可用 - Java 泛型會被編譯器擦除。
幸運的是,您已經有一個類的實例,因此您可以從那里獲取類型信息:
public <T> readXmlToObject(String xmlFileName, T jaxbClass) {
// if jaxbClass is an instance of the data object, you can do this:
JAXBContext context = JAXBContext.newInstance(jaxbClass.getClass());
// alternatively if jaxbClass is an instance of the Class object:
JAXBContext context = JAXBContext.newInstance(jaxbClass);
// ......
}
嘗試通過類本身,像這樣
public <T> readXmlToObject(String xmlFileName, Class<T> class) {
public class XYZ<T> {
...
private Class<T> tClass;
...
public <T> readXmlToObject(String xmlFileName) {
JAXBContext context = JAXBContext.newInstance(tClass);
...
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.