通过变量参数进行潜在的堆污染

问题:

当我使用通用类型的varargs时,我知道Java 7会发生这种情况;
但我的问题是
当Eclipse表示“它的使用可能会污染堆”时,Eclipse是什么意思?

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

回答:

堆污染是技术术语。它指的是具有不是他们指向的对象的超类型的引用。

List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As

这可能导致“无法解释”ClassCastException

// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0); 

 @SafeVarargs根本不阻止这一点。然而,有些方法证明不会污染堆,编译器无法证明它。以前,这种API的呼叫者将会产生令人讨厌的警告,这些警告完全没有意义,但是必须在每个呼叫站点被抑制。现在API作者可以在宣言网站上压制一次。
但是,如果该方法实际上是not安全的,则用户将不再被警告。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Potential heap pollution via varargs parameter

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

20 − 14 =