我對非泛型類泛型類型有點擔心。我正在開發一個API,我有一個Data Model,它有一個Singleton DataModelManager。這個DataModelManager創建DataFactory?擴展DMAbstractObject,其中DMAbstractObject是一個抽象類,告訴「我是DataModel類」。Java泛型類和非泛型類
因此,基本上,當我要創建一個對象,我使用以下代碼:
DMLine線= DataModelManager.getInstance()getDataFactory(DMLine.class).newElement();
的問題是,我使用的功能
public DataFactory<? extends DMAbstractObject> getDataFactory(Class<? extends DMAbstractObject> clazz)
所以Java不知道我回來的DataFactory是同一類型,我的參數clazz中。因爲「擴展DMAbstractObject」告訴「擴展DMAbstractObject的任何對象」。在泛型類中,我可以使用:「T擴展DMAbstractObject」,但不在這裏。
我DataModelManager:(?未經檢查的演員是的DataFactory捕捉#2的擴展DMAbstractObject到的DataFactory DMLine) 公共類DataModelManager {
private static DataModelManager INSTANCE;
public static DataModelManager getInstance(){
if(INSTANCE == null)
INSTANCE = new DataModelManager();
return INSTANCE;
}
private HashMap<Class<? extends DMAbstractObject>, DataFactory<? extends DMAbstractObject>> dataListMap;
/**
* Constructor
*/
private DataModelManager(){
dataListMap = new HashMap<Class<? extends DMAbstractObject>, DataFactory<? extends DMAbstractObject>>();
}
public DataFactory<? extends DMAbstractObject> getDataFactory(Class<? extends DMAbstractObject> clazz){
if(!dataListMap.containsKey(clazz)){
DataFactory<? extends DMAbstractObject> dataList = new DataFactory<>(clazz);
dataListMap.put(clazz, dataList);
return dataList;
}
return dataListMap.get(clazz);
}
}
這不是主要問題,因爲它只會導致一個類型的安全警告,但我想知道是否有適當的方法來做到這一點。
感謝您的回答!
噢對了,我嘗試了一些東西與T延伸...但沒有找到好的語法,使其工作,它似乎與您的答案罰款! 現在我不必每次都在使用我的getDataFactory()。謝謝 ! – user3419255
這將仍然需要在'return(DataFactory)dataListMap.get(clazz)未經檢查的強制轉換;'我相信但通常對於這類事情是安全的。沒有更好的方法來做到這一點。 –
Radiodef
@Radiodef好點。鑑於上面的代碼,它是安全的,因爲'dataListMap'周圍的條件 –