2015-08-27 24 views
3

的Java 7为什么下面的方法不会产生潜在的堆污染?

我写了这个:

public static <E extends Enum<E>> List<SelectItem> getSelectItemList(Enum<E>... es){ 
    List<SelectItem> items = new ArrayList<SelectItem>(); 
    for(Enum<E> e : es){ 
     items.add(new SelectItem(e, e.toString())); 
    } 
    return items; 
} 

而且这种方法没有警告编译。为什么?我预计,这种使用泛型类型的可变参数(这实际上是一个数组)产生

Potential heap pollution via varargs parameter es

你能不能解释一下吗?

+2

它不是'E'数组,而是一个泛型类型为'E'的枚举数组。 – Thomas

回答

2

不可否认类型的可变参数会像这样工作。 Enum<E> ...在运行时有效评估为Enum[]。在这一点上,你不能确定什么引用可能会进入数组。

此处了解详情:https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html

Enum基本类型,实际上给你一些类型 - 安全,即使是在编译的时候,所以我想这就是为什么你是安全的。

相关问题