5

オブジェクトにマーシャリングして戻すマーシャラーには、次のインターフェイスがありObjectます。DataNode

public interface DataMarshaller<T> {

    /**
     * returns the actual class that this marshaller is capable of marshalling.
     * @return 
     */
    Class<T> getDataClass();

    /**
     * marshalls the object to a DataNode
     * 
     * @param object
     * @return 
     */
    DataNode marshal(T object);

    /**
     * unmarshalls the object from a DataNode
     * 
     * @param node
     * @return 
     */
    T unMarshal(DataNode node);

}

オブジェクトの正しいマーシャラーを確実に取得できるようにするために、Class<T> getDataClass()そのクラスを返すメソッドも用意しています (コンパイル後に型消去のために失われていたはずです)。

今、私はこのようなタイプのオブジェクトをマーシャリングできるクラスにこのインターフェースを実装したかったOctree<T>:

public class OctreeMarshaller<T> implements DataMarshaller<Octree<T>> {

    @Override
    public Class<Octree<T>> getDataClass() {
        return Octree.class; //<- compiletime error
    }

    @Override
    public DataNode marshal(Octree<T> object) {
        //...
    }

    @Override
    public Octree<T> unMarshal(DataNode node) {
        //...
    }


}

私の問題は、(もちろん)Octree.classが型Class<Octree<T>>ではなく、非ジェネリック型Class<Octree>であり、Java がそれを にキャストできないことですClass<Octree<T>>

問題は次のとおりです。私がすでに検討した2つよりも、それを解決するためのよりエレガントな方法はありますか?

  • インターフェイスの戻り値を から に変更しClass<T>ますClass<?>
  • のクラス署名をOctreeMarshallerに変更しますpublic class OctreeMarshaller implements DataMarshaller<Octree>
4

2 に答える 2