为什么我的@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):
为什么 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):