在使用Lambdas和泛型时,我遇到了一个特殊的不安全投射警告案例。
在复制和制作SSCCE期间,我发现这可能与lambda有效地"内部"退货声明。
问题是:为什么我会在warningUnnecessarySuppressWarnings
方法中收到警告?。当删除 @SuppressWarnings("unchecked")
时,我得到:
类型安全:从列表到列表的未选中投射
如warningUnsafeCast
方法所示。因此,新警告说,注释不是必需的。
我正在使用Eclipse Kepler SP2 for Java EE Developers,Build ID:20140224-0627
同时使用the recommended
的Java 8 support in Eclipse Kepler更新站点public static void main(String[] args) {
System.out.println(warningUnnecessarySuppressWarnings());
System.out.println(warningUnsafeCast());
System.out.println(withoutWarning());
}
private static Integer perform(Function<List<?>, Integer> func) {
return func.apply(Arrays.asList("a", "b", "c"));
}
private static Integer warningUnnecessarySuppressWarnings() {
return perform(list -> {
@SuppressWarnings("unchecked") // Unnecessary @SuppressWarnings("unchecked")
List<String> unsafeCast = (List<String>) list;
return unsafeCast.size();
});
}
private static Integer warningUnsafeCast() {
return perform(list -> {
List<String> unsafeCast = (List<String>) list; // Type safety: Unchecked cast from List<capture#4-of ?> to List<String>
return unsafeCast.size();
});
}
@SuppressWarnings("unchecked")
private static Integer withoutWarning() {
return perform(list -> {
List<String> unsafeCast = (List<String>) list;
return unsafeCast.size();
});
}
答案 0 :(得分:1)
有问题的代码是类型不安全的,因此应该生成警告。当然需要@SuppressWarnings
注释来抑制此警告。
Eclipse Kepler SP2中显然是一个错误,它会对语句发出警告,但是当添加注释时警告不需要@SuppressWarnings
。
解决方法是在Eclipse编译器配置中禁用“不必要的@SuppressWarning
”警告。