java - 通过 varargs 参数可能造成堆污染

标签 java eclipse generics variadic-functions

我知道在 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

// 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/58244707/

相关文章:

java - 如何使用多个信任源初始化 TrustManagerFactory?

java - selenium 声明的包与预期的包不匹配

java - SWT Combo 的自动完成建议

java - 使用 Java 泛型的 Hibernate 映射异常

java - FileChooser.showOpenDialog 在框架顶部显示默认的 Java 图标

java - JFrame随机渲染图形

c# - 泛型和返回类对象

c# - 在属性中指定 T

Java-如何正确使用list.copyOf?

java - 如何减少 Eclipse Ganymede 的内存使用?