我对非泛型类泛型类型有点担心。我正在开发一个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'周围的条件 –