繁体   English   中英

Java:泛型继承

[英]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的类签名OctreeMarshallerpublic 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM