为什么我的@SuppressWarnings("未经检查")被忽略了?

时间:2015-12-21 23:21:02

标签: java javac suppress-warnings

为什么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,公司名称为redacted。

editor image

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

terminal output

2 个答案:

答案 0 :(得分:1)

更新

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

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

这是在1.8.0u65修正的。

答案 1 :(得分:0)

TL; DR:在方法之前声明已评估的静态字符串作为变通方法。

我能够以一种非常不正统的方式清除警告,而可能是一个错误 - 或者一些荒谬的特征&#34; :)

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

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

使字符串成为同一个类中的私有成员无效,仍然会产生编译器警告(b)。

some examples

如果我们首先评估常量,它不会产生警告,如(d)中所示:

workaround