[英]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
的類簽名OctreeMarshaller
為public 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.