为什么我的@SuppressWarnings("unchecked") 被忽略了?

Why is my @SuppressWarnings("unchecked") ignored?

为什么 Javac 忽略我在下面代码中的 @SuppressWarnings 注释?

@Override
@Transactional(readOnly = true, timeout = 10)
public List<Item> findAllDue() {
    Query query = getSession().createQuery("from Item item where item.status = :status");
    @SuppressWarnings("unchecked")
    List<Item> list = query.setString("status", ItemState.MY_STRING_STATUS).list(); //This is line 43.  yes, I know it can be an Enum instead
    return list;
}

使用 Xlint 编译后,警告如下:

Warning:(43, 106) java: unchecked cast
  required: java.util.List<com.company.domain.Item>
  found:    java.util.List

代码构建成功,但出现此警告。这可能无关紧要,但这是 Spring 4 和 Hibernate 4。

根据评论更新:

我试图针对一般情况编辑我的示例,而不是提供公司特定的代码。对于那些快速投反对票的人,作为支持证据:这是我的编辑器的实际输出和实际代码,使用 Java 7 并编辑了公司名称。

下面是终端输出,没有使用编辑器,而是使用 ant javac:

更新:

这是影响以下版本的 javac 错误:6u51、7u21、8。已在此处报告并修复:JDK-8016099

其他相关报告是:JDK-8022144 and JDK-8016636但它们都被标记为与第一个重复。

已在 1.8.0u65 中修复。

TL; DR:作为解决方法,在方法之前声明评估的静态字符串。

我能够以一种相当非正统的方式清除警告,它 可能是一个错误 - 或者一些荒谬的 "feature" :)。

以下示例描述了该行为。每个都使用 @SuppressWarnings 注释。

如果我在 (a) 中使用评估的字符串,则不会显示任何警告。 如果我像 (b) 那样在方法调用之前声明 String,则不会显示任何警告。

使字符串成为同一 class 中的私有成员没有任何效果,仍然会产生编译器警告 (b)。

如果我们先计算常量,它不会产生警告,如 (d):