14

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?
   .......
}
4

6 に答える 6

17

代わりにクラスオブジェクトを渡すと簡単です。

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 );
}

ここでの考え方は、オブジェクトからタイプパラメータを抽出できないため、逆の方法で行う必要があるということです。クラスから始めて、タイプパラメータに一致するようにオブジェクトを操作します。

于 2012-05-29T13:52:18.283 に答える
7

他の人の言うことを聞かないでください...あなたはそれを得ることができます。

jaxbClassパラメータのタイプを次のように変更するだけClass<T>です。

public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) {
   JAXBContext context = JAXBContext.newInstance(jaxbClass);
   .......
}
于 2012-05-29T13:53:42.117 に答える
3

実行時にのクラスを取得することはできません。Javaは、Type Safe Erasureを使用してジェネリックを実装します。つまり、ジェネリック型の理解は、コンパイルまでにのみ適用されます。クラスを取得する場合は、実行時に実際のオブジェクトに問い合わせる必要があります。

于 2012-05-29T13:51:28.303 に答える
1

この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);
   // ......
}
于 2012-05-29T13:52:42.773 に答える
1

クラス自体を渡すようにしてください、このようなもの

public <T> readXmlToObject(String xmlFileName, Class<T> class) {
于 2012-05-29T13:52:44.773 に答える
0
public class XYZ<T> {
    ...
    private Class<T> tClass;    
    ...
    public <T> readXmlToObject(String xmlFileName) {
       JAXBContext context = JAXBContext.newInstance(tClass);
       ...
    }
    ...
} 
于 2014-07-25T17:03:04.140 に答える