有时在查看代码时,我看到许多方法都指定了注释:

@SuppressWarnings("unchecked")

这是什么意思?


当前回答

这也可能意味着当前的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关闭这些可怕的警告。

一个技巧是创建一个扩展通用基础接口的接口…

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泛型就是不能让您做您想做的事情,您需要有效地告诉编译器您所做的事情在执行时是合法的。

在模拟通用接口时,我通常发现这很麻烦,但也有其他例子。通常值得尝试一种方法来避免警告,而不是抑制它(Java泛型常见问题解答在这里有所帮助),但有时即使有可能,它也会使代码变形,以至于抑制警告会更整洁。在这种情况下,总是添加解释性评论!

相同的泛型常见问题解答有几个关于这个主题的部分,从“什么是“未检查的”警告?”-很值得一读。

这也可能意味着当前的Java类型系统版本不适合您的情况。有几个JSR命题/ hack可以解决这个问题:类型令牌、超级类型令牌、Class.cast()。

如果你真的需要这个抑制,尽可能缩小它的范围(例如,不要把它放在类本身或一个长方法上)。一个例子:

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

   Collections.reverse(list);
   return list;
}

你可以取消编译器的警告,并告诉泛型你所写的代码是合法的。

例子:

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