我有一個編組以下接口執法官的Object
到DataNode
對象和背部:的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.class
是Class<Octree<T>>
類型的未而是的非泛型類型Class<Octree>
和Java不會允許我將它轉換爲Class<Octree<T>>
。
現在的問題是:有沒有解決,除兩個我已經被認爲是一種更高貴的方式:
- 變化,從
Class<T>
的界面Class<?>
- 變化的類簽名的返回值
OctreeMarshaller
到public class OctreeMarshaller implements DataMarshaller<Octree>
不知道你使用的是什麼的'Class'對象,但也許超類型令牌你在找什麼:http://gafter.blogspot.sk/2006/12/super-type-tokens.html。它們是在運行時表達「嵌套」泛型類型的一種方式,儘管任何實際的類型檢查都必須實現。 (也就是說,你不會自動得到一個「聰明」的'Class.cast()'或其他東西)。 – millimoose