2012-04-09 2 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をパラメータとして使用する問題が発生します。これは、Objectを拡張するプールと矛盾します。

ご協力いただければ幸いです。

ありがとうございます!

エリック

答えて

3

これは、Javaの型システムは、あなたのMapは、いくつかのObjectPool<? super T>にタイプTの任意のオブジェクトをマップ制約を表現するのに十分な強さではないという理由だけで、@SuppressWarningsなしでなんとかではありません。

ジェネリックスは、Javaでのさまざまな操作の型安全性を証明するように設計されていますが、実行している処理には十分強力ではありません。コンパイラに「あなたがしていることを知っていることを信用する」ことを伝えるだけです。これは@SuppressWarningsが対象です。

+0

これは私が思っていたものとほとんど同じですが、おそらくジェネリックの洞察力のある人には素晴らしい解決策があると考えていました。ないと思います。 :) –

1

Javaジェネリックではできません。しかし、あなたのオブジェクトプールのキャッシュをMap<Class<?>, ObjectPool<?>>またはMap<Object, ObjectPool<?>>と総称する必要がありますか?

+0

いいえ - どのオブジェクトがどのプールから取得されたのか知る必要があるためです。取得されたオブジェクトは実際にはパラメータ化されたオブジェクトです(つまりジェネリックで)。各タイプは異なるプールに属します。したがって、オブジェクトクラスをキーとして使用することは役に立ちません。 –