我有一个编组器的以下接口,它将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>>
.
现在的问题是:有没有比我已经考虑过的两种更优雅的方法来解决这个问题:
- 将接口中的返回值从更改
Class<T>
为Class<?>
- 将类签名更改
OctreeMarshaller
为public class OctreeMarshaller implements DataMarshaller<Octree>