オブジェクトにマーシャリングして戻すマーシャラーには、次のインターフェイスがあり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>