[英]Java: Generics Inheritance
对于编组器,我具有以下接口,该接口将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<Octree<T>>
。
现在的问题是:有没有比我已经考虑过的两种方法更优雅的解决方法:
Class<T>
更改为Class<?>
OctreeMarshaller
的类签名OctreeMarshaller
为public class OctreeMarshaller implements DataMarshaller<Octree>
没有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;
}
[...]
}
对于通用类型的Class
,您需要进行两次强制转换:
public Class<Octree<T>> getDataClass() {
return (Class<Octree<T>>)(Class<?>)Octree.class;
}
古怪的,但它可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.