通过varargs参数可能导致堆污染

我理解Java 7在使用泛型类型的varargs时会出现这种情况

但我的问题是

Eclipse说“它的使用可能会污染堆”的确切含义是什么

新的@SafeVarargs注释如何防止这种情况

堆污染是一个技术术语。它引用的类型不是所指向对象的超类型的引用

列表<A>listOfAs=新阵列列表&lt&燃气轮机;();
列表<B>listOfBs=(List<B>)(Object)listOfAs;//指向一个As列表

这可能导致;“无法解释”ClassCastExceptions

//如果堆从未受到污染,则不会抛出CCE
B=listOfBs.get(0);

@SafeVarargs根本无法阻止这一点。然而,有些方法可以证明不会污染堆,编译器无法证明。以前,此类API的调用者会收到恼人的警告,这些警告完全没有意义,但必须在每个调用站点进行抑制。现在API作者可以在声明站点对其进行一次抑制

但是,如果该方法实际上是不安全的,那么用户将不再受到警告

发表评论