user3419255
user3419255

Reputation: 63

Java generic classes and non-generic class

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

Answers (1)

John B
John B

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

Related Questions