我正在尝试使用泛型编写代码,但似乎无法弄清楚如何使用@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>就会使我陷入一个问题,即我的方法使用对象作为参数,这与扩展对象的池不一致。

任何援助将不胜感激。

谢谢!

埃里克

最佳答案

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

泛型旨在证明Java中各种操作的类型安全性,但是它们的功能不足以执行您的操作。您只需要告诉编译器“信任您知道自己在做什么”,这就是@SuppressWarnings的目的。

10-07 23:54