2013-10-26 135 views
5

我有一個編組以下接口執法官的ObjectDataNode對象和背部:的Java:泛型繼承

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.classClass<Octree<T>>類型的未而是的非泛型類型Class<Octree>和Java不會允許我將它轉換爲Class<Octree<T>>

現在的問題是:有沒有解決,除兩個我已經被認爲是一種更高貴的方式:

  • 變化,從Class<T>的界面Class<?>
  • 變化的類簽名的返回值OctreeMarshallerpublic class OctreeMarshaller implements DataMarshaller<Octree>
+0

不知道你使用的是什麼的'Class'對象,但也許超類型令牌你在找什麼:http://gafter.blogspot.sk/2006/12/super-type-tokens.html。它們是在運行時表達「嵌套」泛型類型的一種方式,儘管任何實際的類型檢查都必須實現。 (也就是說,你不會自動得到一個「聰明」的'Class.cast()'或其他東西)。 – millimoose

回答

4

如果沒有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; 
    } 

    [...] 
} 
+0

這解決了我的問題。我從來沒有想過雙投它 - 所以謝謝! :) – Entrusc

1

隨着泛型類型Class,你需要一個雙投:

public Class<Octree<T>> getDataClass() { 
    return (Class<Octree<T>>)(Class<?>)Octree.class; 
} 

Whacky,但它的工作原理。

+0

但是鑄造是一種矛盾類型安全 – siledh