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>遇到了一个问题,即我的方法使用 Object 作为参数,这与扩展 Object 的池不一致。

任何援助将不胜感激。

谢谢!

埃里克

4

2 回答 2

3

如果没有 ,这是不可行@SuppressWarnings的,因为 Java 的类型系统不够强大,无法表达Map将任何类型的对象映射T到 some的约束ObjectPool<? super T>

泛型旨在证明 Java 中各种操作的类型安全性,但它们对于您正在做的事情还不够强大。你只需要告诉编译器“相信你知道你在做什么”,这就是@SuppressWarnings目的。

于 2012-04-09T15:44:48.740 回答
1

你不能用 Java 泛型来做到这一点。但我想知道您的对象池缓存是否应该被泛化为Map<Class<?>, ObjectPool<?>>Map<Object, ObjectPool<?>>

于 2012-04-09T15:56:39.030 回答