首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:泛型继承

Java:泛型继承
EN

Stack Overflow用户
提问于 2013-10-26 13:27:42
回答 2查看 3.3K关注 0票数 5

我有一个封送处理程序的接口,它将一个Object封送到一个DataNode对象并返回:

代码语言:javascript
复制
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>类型的对象:

代码语言:javascript
复制
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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-26 13:52:17

如果没有Octree<T>实例,就不能构造Class<Octree<T>>类型的类对象。但是由于我们知道(由于类型擦除)在运行时只有一个类Octree,所以编写是安全的

代码语言:javascript
复制
public class OctreeMarshaller<T> implements DataMarshaller<Octree<T>> {

    @Override
    @SuppressWarnings("unchecked")
    public Class<Octree<T>> getDataClass() {
        return (Class<Octree<T>>)(Class<?>)Octree.class;
    }

    [...]
}
票数 4
EN

Stack Overflow用户

发布于 2013-10-26 13:51:41

对于一般类型的Class,您需要双重强制转换:

代码语言:javascript
复制
public Class<Octree<T>> getDataClass() {
    return (Class<Octree<T>>)(Class<?>)Octree.class;
}

很古怪,但很管用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19607276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档