我有一个封送处理程序的接口,它将一个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>发布于 2013-10-26 13:52:17
如果没有Octree<T>实例,就不能构造Class<Octree<T>>类型的类对象。但是由于我们知道(由于类型擦除)在运行时只有一个类Octree,所以编写是安全的
public class OctreeMarshaller<T> implements DataMarshaller<Octree<T>> {
@Override
@SuppressWarnings("unchecked")
public Class<Octree<T>> getDataClass() {
return (Class<Octree<T>>)(Class<?>)Octree.class;
}
[...]
}发布于 2013-10-26 13:51:41
对于一般类型的Class,您需要双重强制转换:
public Class<Octree<T>> getDataClass() {
return (Class<Octree<T>>)(Class<?>)Octree.class;
}很古怪,但很管用。
https://stackoverflow.com/questions/19607276
复制相似问题