java - 如何在不需要 @SuppressWarnings 的情况下正确编码此泛型

标签 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;不需要特定的父类(super class)型。

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

如有任何帮助,我们将不胜感激。

谢谢!

埃里克

最佳答案

如果没有@SuppressWarnings,这是不可能实现的,只是因为 Java 的类型系统不够强大,无法表达您的 Map 的约束映射 T 类型的任何对象给一些ObjectPool<? super T> .

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

关于java - 如何在不需要 @SuppressWarnings 的情况下正确编码此泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10075734/

相关文章:

java - Oracle JDBC 在 Linux 上没有给出预期的输出

java - 在后增量中更新 for 循环中的变量

java - 不断增长的 Java 进程驻留内存使用 (RSS)

qt - 如何抑制标题中包含的文件的警告

java - Xpages 脱离服务器端缓存

c# - 使用泛型清理代码

Java - 使用泛型的多重签名?

c++ - 通用常数时间比较函数 C++

java - IntelliJ IDEA @SuppressWarnings 用于检查工具名称

控件到达具有自定义退出功能的非空函数的结尾