簡體   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