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

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

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

相关文章:

c# - 为什么我的测试 "propType == typeof(ObservableCollection<string>)"失败了?

java - 安卓初学者 : ListView with Images and CheckBoxes

java - 类型推断在 Java 中是如何工作的,或者为什么 mockito 甚至可以编译

Java分区错误

java - 使用递归获得回文的有效方法

java - 重复调用 System.currentTimeMillis()/nanoTime()

java - 如何以编程方式旋转存储为一维数组的位图图像?

java - android 日历 API 与 android 的谷歌日历 API 相同吗?

android - 请问这个渲染库版本比你eclipse中的ADT插件版本更新怎么办?

java - 为什么涉及泛型的这个会出现编译时错误?