如何在不需要@SuppressWarnings的情况下正确编写此通用代码

时间:2012-04-09 15:42:18

标签: java generics suppress-warnings

我试图用泛型编写代码,但似乎无法弄清楚如何使用@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是原始类型,返回声明中有类型安全警告。

我的概念如下;我正在寻找对象/池对的映射,以便知道从哪个池中检索对象,以便知道返回对象的池。

ObjectPool可以是任何类型对象的ObjectPool;没有特定的超类型。

我已尝试使用<? extends Object>,但我并不完全确定如何使用它而不会导致编译错误。只需用<?>替换<? extends Object>,我就会遇到一个问题,即我的方法使用Object作为参数,这与扩展Object的池不一致。

任何帮助都将不胜感激。

谢谢!

埃里克

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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