Heap Pollution
首先来看下什么是Heap Pollution(堆污染)。
在Java编程语言中, 当一个 可变泛型参数 指向一个 无泛型参数 时,堆污染(Heap Pollution)就有可能发生。
举例一:
创建一个方法,空实现即可,如下所示
public static void varagMethod(Set objects) {
}
此方法接受的是一个泛型为Integer类型的Set集合,假如我们将一个没有泛型的Set对象传给此方法时,则有可能造成堆污染,如下所示
public static void main(String[] args) {
Set set = new TreeSet();
set.add("abc");
varagMethod(set);
}
以上代码,我们将一个无泛型的Set传递给了varagMethod方法,此时就有可能造成堆污染。当发生这种情况时,编译器可以检测到,并给我们Warning,如下
而Heap Pollution有可能导致更严重的后果 : ClassCastException, 我们在刚才的varagMethod方法中添加几行代码如下:
public static void varagMethod(Set objects) {
objects.add(new Integer(10));
}
然后修改下main方法
public static void main(String[] args) {
Set set = new TreeSet();
varagMethod(set);
Iterator iter = set.iterator();
while (iter.hasNext()) {
String str = iter.next(); // ClassCastException thrown
System.out.println(str);
}
}
然后重新运行一下,程序直接 Crash!!!
可以看到,程序报了一个ClassCastException(类型转换错误),这是因为Java允许