有时在查看代码时,我看到许多方法都指定了注释:
@SuppressWarnings("unchecked")
这是什么意思?
有时在查看代码时,我看到许多方法都指定了注释:
@SuppressWarnings("unchecked")
这是什么意思?
当前回答
它是一个注释,用于禁止编译关于未检查的泛型操作(而不是异常)的警告,比如强制转换。它本质上意味着程序员不希望在编译特定代码时被通知这些他已经知道的信息。
你可以在这里阅读更多关于这个特定注释的内容:
SuppressWarnings
此外,Oracle还提供了一些关于注释用法的教程文档:
注释
正如他们所说,
“在使用泛型出现之前编写的遗留代码(在泛型这一课中讨论)时,可能会出现‘unchecked’警告。”
其他回答
一个技巧是创建一个扩展通用基础接口的接口…
public interface LoadFutures extends Map<UUID, Future<LoadResult>> {}
然后你可以在转换之前用instanceof检查它…
Object obj = context.getAttribute(FUTURES);
if (!(obj instanceof LoadFutures)) {
String format = "Servlet context attribute \"%s\" is not of type "
+ "LoadFutures. Its type is %s.";
String msg = String.format(format, FUTURES, obj.getClass());
throw new RuntimeException(msg);
}
return (LoadFutures) obj;
这也可能意味着当前的Java类型系统版本不适合您的情况。有几个JSR命题/ hack可以解决这个问题:类型令牌、超级类型令牌、Class.cast()。
如果你真的需要这个抑制,尽可能缩小它的范围(例如,不要把它放在类本身或一个长方法上)。一个例子:
public List<String> getALegacyListReversed() {
@SuppressWarnings("unchecked") List<String> list =
(List<String>)legacyLibrary.getStringList();
Collections.reverse(list);
return list;
}
据我所知,目前它与抑制关于泛型的警告有关;泛型是一种新的编程结构,在JDK 5之前的版本中不支持,因此任何新旧结构的混合都可能导致一些意想不到的结果。
编译器会警告程序员,但是如果程序员已经知道了,他们可以使用SuppressWarnings关闭这些可怕的警告。
你可以取消编译器的警告,并告诉泛型你所写的代码是合法的。
例子:
@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
list = testMenuService.getMeal(reservationMealPlan);
return list;
}
SuppressWarning注释用于对带注释的元素禁用编译器警告。具体来说,未检查的类别允许抑制因未检查的类型强制转换而生成的编译器警告。