2

ジェネリックスで何かをコーディングしようとしていますが、@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>、メソッドがオブジェクトをパラメータとして使用するという問題が発生します。これは、オブジェクトを拡張するプールと矛盾します。

どんな援助もいただければ幸いです。

ありがとう!

エリック

4

2 に答える 2

3

これは、Java の型システムが型の任意のオブジェクトを何らかのにマップ@SuppressWarningsするという制約を表現するほど強力ではないという理由だけで、なしでは実行できません。MapTObjectPool<? super T>

ジェネリクスは、Java でのさまざまな操作の型安全性を証明するように設計されていますが、実際に行っていることに対して十分に強力ではありません。コンパイラに「自分が何をしているのかを知っていることを信頼する」ように指示する必要があります。これ@SuppressWarningsが目的です。

于 2012-04-09T15:44:48.740 に答える
1

Javaジェネリックではそれを行うことはできません。しかし、オブジェクト プール キャッシュを生成する必要があるかどうか疑問に思っていますMap<Class<?>, ObjectPool<?>>またはMap<Object, ObjectPool<?>>?

于 2012-04-09T15:56:39.030 に答える