我了解 Java 7 在使用泛型类型的可变参数时会发生这种情况;
但我的问题是..
当 Eclipse 说“它的使用可能会污染堆”时,究竟是什么意思?
还有
新的 @SafeVarargs
注释如何防止这种情况发生?
最佳答案
堆污染是一个技术术语。它指的是类型不是它们指向的对象的父类(super class)型的引用。
List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As
这可能导致“无法解释的”ClassCastException
s。
// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0);
@SafeVarargs
根本不会阻止这一点。但是,有些方法可以证明不会污染堆,编译器无法证明。以前,此类 API 的调用者会收到令人讨厌的警告,这些警告完全没有意义,但必须在每个调用站点都被抑制。现在 API 作者可以在声明站点将其禁止一次。
但是,如果该方法实际上是不安全的,用户将不再被警告。
关于java - 通过 varargs 参数可能造成的堆污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12462079/