2014-03-31 81 views
2

我对非泛型类泛型类型有点担心。我正在开发一个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); 


    } 
} 

这不是主要问题,因为它只会导致一个类型的安全警告,但我想知道是否有适当的方法来做到这一点。

感谢您的回答!

回答

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

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

+0

噢对了,我尝试了一些东西与T延伸...但没有找到好的语法,使其工作,它似乎与您的答案罚款! 现在我不必每次都在使用我的getDataFactory()。谢谢 ! – user3419255

+1

这将仍然需要在'return(DataFactory )dataListMap.get(clazz)未经检查的强制转换;'我相信但通常对于这类事情是安全的。没有更好的方法来做到这一点。 – Radiodef

+0

@Radiodef好点。鉴于上面的代码,它是安全的,因为'dataListMap'周围的条件 –