2014-03-31 84 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'周圍的條件 –