什么是Java中的SuppressWarnings(“unchecked”)?

有时通过代码查看,我看到许多方法指定一个注释:

@SuppressWarnings("unchecked") 

这是什么意思?

有时Javagenerics不会让你做你想做的事情,而且你需要有效地告诉编译器你在做什么在执行时是合法的。

当我嘲笑一个通用接口时,我通常会觉得这很痛苦,但也有其他的例子。 通常值得尝试一种避免警告而不是抑制的方法( Javagenerics常见问题解答在这里有帮助),但有时即使可能,它也会使代码变形太多,以至于抑制警告更为简洁。 在这种情况下总是添加一个解释性评论!

同样的generics常见问题有几个部分关于这个话题,从“什么是”未经检查的“警告?”开始。 – 这是值得一读的。

这是一个注释,禁止关于未经检查的generics操作(而不是例外)的编译警告,如强制转换。 它基本上意味着程序员不希望被通知在编译特定位代码时他已经知道这些。

你可以在这里阅读更多关于这个具体的注释:

SuppressWarnings

另外,Oracle在这里提供了一些有关注释使用的教程文档:

注释

正如他们所说,

“在与generics出现之前编写的遗留代码接口(在标题为”generics“的课程中讨论)时,可能会发生”未经检查“的警告。

这也可能意味着当前的Javatypes系统版本不够适合您的情况。 有几个JSR的命题 /黑客来解决这个问题:types的令牌, 超types的令牌 ,Class.cast()。

如果你真的需要这种压抑,尽可能地缩小它(例如,不要把它放在课堂本身或长时间的方法)。 一个例子:

 public List<String> getALegacyListReversed() { @SuppressWarnings("unchecked") List<String> list = (List<String>)legacyLibrary.getStringList(); Collections.reverse(list); return list; } 

SuppressWarning注释用于抑制注释元素的编译器警告。 具体来说, unchecked类别允许抑制由于未检查types转换而生成的编译器警告。

您可以禁止编译器警告,并告诉generics您所写的代码是合法的。

例:

 @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; } 

简单地说:这是编译器指出它不能确保types安全的警告。

JPA服务方法例如:

 @SuppressWarnings("unchecked") public List<User> findAllUsers(){ Query query = entitymanager.createQuery("SELECT u FROM User u"); return (List<User>)query.getResultList(); } 

如果我没有在这里指定@SuppressWarnings(“unchecked”),那么在我想返回ResultList的地方会出现问题。

在快捷方式types安全方式中:如果程序编译时没有错误和警告,并且在运行时不会引发任何意外的ClassCastException,则认为程序是types安全的。

我build立在http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html

一个技巧是创build一个扩展通用基本接口的接口…

 public interface LoadFutures extends Map<UUID, Future<LoadResult>> {} 

那么你可以在cast之前用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; 

据我所知,现在这与抑制有关仿制药的警告有关。 generics是JDK 5以前版本中不支持的新编程构造,因此旧构造与新构造的混合可能会带来一些意想不到的结果。

编译器会向程序员发出警告,但是如果程序员已经知道,他们可以使用SuppressWarningsclosures这些可怕的警告。