Java 为什么我的@SuppressWarnings(“未检查”)被忽略?

Java 为什么我的@SuppressWarnings(“未检查”)被忽略?,java,javac,suppress-warnings,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("unc

为什么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;
}
@覆盖
@事务性(只读=true,超时=10)
公共列表findAllDue(){
Query Query=getSession().createQuery(“来自Item Item,其中Item.status=:status”);
@抑制警告(“未选中”)
List List=query.setString(“status”,ItemState.MY_STRING_status).List();//这是第43行。是的,我知道它可以改为枚举
退货清单;
}
使用Xlint编译后,警告如下:

Warning:(43, 106) java: unchecked cast
  required: java.util.List<com.company.domain.Item>
  found:    java.util.List
警告:(43106)java:未选中强制转换
必需:java.util.List
找到:java.util.List
代码生成成功,但出现此警告。这可能没关系,但这是Spring4和Hibernate4

根据评论更新:

我试图为一般情况编辑示例,而不是提供特定于公司的代码。对于那些很快投反对票的人,作为支持证据:下面是我的编辑器的实际输出和实际代码,使用公司名称经过编辑的Java7

以下是终端输出,不使用编辑器,但使用带有ant的javac:

更新: 这是一个影响版本6u51、7u21、8的javac错误。已在此处报告并修复:

其他相关报告包括:和,但它们都标记为与第一个报告重复


固定在1.8.0u65中。

TL;DR:在方法之前声明已计算的静态字符串作为解决方法。

我能够以一种非正统的方式清除警告,这可能是一个bug——或者是一些可笑的“特性”:

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

如果使用(a)中的计算字符串,则不会显示任何警告。 如果在方法调用之前声明字符串(如(b)所示),则不会显示任何警告

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

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


这可能是一个明显的问题,但您确定警告与抑制在同一行吗?它可能是在抱怨
返回列表?毕竟,
List
List
是不一致的。Java的哪个版本?@AndyTurner-那是一个打字错误。用实际返回类型更新了问题。有人能解释投票失败的原因吗?@SotiriosDelimanolis请看一下我的答案。@bphilipnyc你能检查一下你用来编译的Java版本吗?您可以在命令行上使用:
javap-verbose MyClass | findstr“major”
,如下所述:。@AndyTurner谢谢,我在一些搜索后更改了答案给我一点时间-需要尝试使用Java 8更新我的项目后,在1.8.0 G中验证更正。是的,这看起来很像IDE错误。不,对于未来的读者来说,在命令行上也是一样的(如问题中所示),如果你看到这篇文章而不可能升级,这仍然是一个有效的解决方法。