2012-04-09 46 views
2

我想用泛型編碼,但似乎無法弄清楚如何避開使用@SuppressWarnings。如何正確編寫這個通用而不需要@SuppressWarnings

我有以下幾點:

/** 
* Cache to know which pool provided which object (to know where to return object when done) 
*/ 
private Map<Object, ObjectPool<?>> objectPoolCache = new ConcurrentHashMap<Object, ObjectPool<?>>(); 

/** 
* Returns a borrowed pool object to the pool 
* @param o 
* @throws Exception 
*/ 
public void returnToPool(Object o) throws Exception { 
    // safety check to ensure the object was removed from pool using this interfact 
    if(!objectPoolCache.containsKey(o)) 
     throw new IllegalStateException("Object is not in pool cache. Do not know which pool to return object to"); 

    // get the object pool 
    ObjectPool pool = objectPoolCache.remove(o); 

    // return the object to the pool 
    pool.returnObject(o); 
} 

現在,我得到一個警告,ObjectPool pool是原始類型和return語句類型安全警告。

我的概念如下;我正在尋找一個對象/池對的映射,以便我知道從哪個池中檢索了一個對象,以便知道要將對象返回到哪個池。

ObjectPool可以是任何類型對象的ObjectPool;不需要特定的超類型。

我試過使用<? extends Object>,但我不完全確定如何使用它而不會導致編譯錯誤。只需用<? extends Object>替換<?>就會遇到一個問題,我的方法使用Object作爲參數,這與擴展對象的池不一致。

任何援助將不勝感激。

謝謝!

埃裏克

回答

3

這不是沒有@SuppressWarnings可行的,只是因爲Java的類型系統是沒有強大到足以表達你的Map映射T類型的任何對象的一些ObjectPool<? super T>約束。泛型被設計用來證明Java中各種操作的類型安全性,但它們對於你正在做的事不夠強大。你只需告訴編譯器「相信你知道你在做什麼」,這就是@SuppressWarnings的用途。

+0

這幾乎是我的想法,但認爲也許有更多的泛型洞察力的人會有一個奇特的解決方案。可能不會。 :) – 2012-04-09 16:54:59

1

你不能用Java泛型來做到這一點。但我想知道你的對象池緩存是否應該被聚合爲Map<Class<?>, ObjectPool<?>>Map<Object, ObjectPool<?>>

+0

不是 - 因爲我需要知道哪個對象是從哪個池中檢索的。檢索的對象實際上是參數化對象(即:具有泛型),並且每種類型都屬於不同的池。因此,將對象類用作關鍵字不會有幫助。 – 2012-04-09 16:57:38

相關問題