2013-06-04 172 views
-1

我創建了一個HashMap,它將我的抽象Model的類保存爲key,然後將Model的一個實例保存爲值。雖然我似乎無法補充。看起來Java並沒有足夠的智能來認識到我放入HashMap的實際上是Model實例的一個子類。向hashmap添加泛型類

abstract public class EntityManager<AbstractModel> { 

    @Inject 
    protected static Injector injector; 

    private HashMap<Class<? extends AbstractModel>, AbstractModel> models = new HashMap<Class<? extends AbstractModel>, AbstractModel>(); 

    public void register(final AbstractModel model) { 

     models.put(model.getClass(), model); // <-- the problem 

    } 

    public AbstractModel get(Class<? extends AbstractModel> Class) { 

     AbstractModel model = models.get(Class); 

     if (model == null) { 

      throw new RuntimeException("Attempting to retrieve an unregistered model."); 

     } else { 

      return model; 
     } 
    } 
} 

的IntelliJ是告訴我它試圖添加Class<? extends Object>代替Class<? extends Model>

+0

注會:1.你應該使用界面,即'Map'; 2.所有類都是單例,所以你應該使用'IdentityHashMap':'private Map ,AbstractModel> models = new IdentityHashMap ,AbstractModel>();' – fge

+1

你正在做的事情幾乎就是Guava的['MutableClassToInstanceMap'](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/谷歌/普通/收集/ MutableClassToInstanceMap.html)。 –

+0

這編譯罰款:http://ideone.com/0QsACc我錯過了什麼? –

回答

2

此處使用的.getClass()方法是Object之一。而its documentation說,你應該在這裏做什麼:

final Class<? extends AbstractModel> c = model.getClass(); 
models.put(c, model); 
+0

啊好的甜,謝謝。 – David

+0

兩個注意:請參閱@ joaonlima的答案,你可以投(但我討厭演員,所以我儘量避免他們,當我可以);另外,請參閱我對您的問題的評論:所有'Class'對象都是單例,這就是爲什麼您可以使用'IdentityHashMap'(請參閱此特定映射實現的javadoc)。 – fge

+0

注意。感謝那!我改變了我的代碼來使用IdentityHashMap。我沒有存在。 – David

0

您可以只投的呼叫:

models.put((Class<? extends AbstractModel>) model.getClass(), model); 
0

感謝答案和建議,我結束了與此

abstract public class EntityManager<AbstractModel> { 

    @Inject 
    protected static Injector injector; 

    private Map<Class<? extends AbstractModel>, AbstractModel> map = new IdentityHashMap<Class<? extends AbstractModel>, AbstractModel>(); 

    public EntityManager(){ 
     setUp(); 
    } 

    public void register(Class<? extends AbstractModel> clazz) { 

     map.put(clazz, injector.getInstance(clazz)); 
    } 

    public AbstractModel get(Class<? extends AbstractModel> clazz) { 

     AbstractModel model = map.get(clazz); 

     if (model == null) { 

      throw new RuntimeException("Attempting to retrieve an unregistered model."); 

     } else { 

      return model; 
     } 
    } 

    abstract void setUp(); 
}