Reputation: 63
I have a little concern about generics type in non-generic classes. I'm working on an API where i have a Data Model, which has a singleton DataModelManager. This DataModelManager creates DataFactory ? extends DMAbstractObject where DMAbstractObject is an abstract class telling "i'm a DataModel class".
So basically, when i want to create an object, i use this code :
DMLine line = DataModelManager.getInstance().getDataFactory(DMLine.class).newElement();
The problem is that i'm using the function
public DataFactory<? extends DMAbstractObject> getDataFactory(Class<? extends DMAbstractObject> clazz)
So Java can't know my returned DataFactory is from the same type that my parameter clazz. Because "? extends DMAbstractObject" tells "any object extending DMAbstractObject". In a generic class, i could use : "T extends DMAbstractObject" but not here.
My DataModelManager : public class 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);
}
}
It's not a major issue because it's only cause a Type safety Warning (Unchecked cast from DataFactory capture#2-of ? extends DMAbstractObject to DataFactory DMLine), but i would like to know if there was a proper way to do this.
Thanks for your answers !
Upvotes: 2
Views: 816
Reputation: 32949
public <T extends DMAbstractObject> DataFactory<T> getDataFactory(Class<T> clazz)
use a generic to lock down the type. Generics can be defined at the method level as well as at the class level.
Upvotes: 3