Java泛型类和非泛型类

时间:2014-03-31 11:34:52

标签: java generics

我对非泛型类中的泛型类型有点担心。我正在开发一个API,我有一个数据模型,它有一个单独的DataModelManager。这个DataModelManager创建DataFactory?扩展DMAbstractObject,其中DMAbstractObject是一个抽象类,告诉我"我是一个DataModel类"。

所以基本上,当我想创建一个对象时,我使用这个代码:

DMLine line = DataModelManager.getInstance()。getDataFactory(DMLine.class).newElement();

问题是我使用的功能

public DataFactory<? extends DMAbstractObject> getDataFactory(Class<? extends DMAbstractObject> clazz)

因此,Java无法知道我返回的DataFactory与我的参数clazz的类型相同。因为&#34;?扩展DMAbstractObject&#34;告诉&#34;任何扩展DMAbstractObject&#34;的对象。在泛型类中,我可以使用:&#34; T扩展DMAbstractObject&#34;但不是这里

我的DataModelManager:     公共类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);


     }
 }

这不是一个主要问题,因为它只会导致类型安全警告(从DataFactory捕获未经检查的强制转换#2-of?将DMAbstractObject扩展到DataFactory DMLine),但我想知道是否存在这是一个正确的方法。

感谢您的回答!

1 个答案:

答案 0 :(得分:3)

public <T extends DMAbstractObject> DataFactory<T> getDataFactory(Class<T> clazz)

使用通用来锁定类型。泛型可以在方法级别和类级别定义。