簡體   English   中英

從泛型類型 T 獲取“Class”對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM