我们使用了一些varargs函数,当我们转向java 1.7时,我们得到一个奇怪的未经检查的警告。
在ICache接口中添加功能
public interface ICache<O> {
void add(Object source, O... objects);
}
接口中的报告错误。
ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O
void add(Object source, O... objects);
where O is a type-variable:
O extends Object declared in interface ICache
1 warning
O扩展Object,作为其通用缓存类。
我读了xlint警告,我们用unchecked编译,但http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示这个错误应该是[varargs]类型而不是未经检查的类型。
我错过了什么吗?
答案 0 :(得分:2)
堆污染是一个术语,指的是指向对象的类型,当使用具有泛型类型的varargs时,它不是超类型。当参数化类型的变量引用不是该参数化类型的对象时,就会发生这种情况。关于堆栈溢出的This帖子向您解释了这意味着什么以及您应该对此做些什么,并提供有关@SafeVarargs
注释的详细信息。因此,在接口ICache
中,vararg类型O
指向接口中的Object
,但O
不是Object
的超类型,这会生成堆污染警告。请注意它是如何表示可能堆污染。如果您的代码没有导致任何问题,例如导致ClassCastException
,它可能是安全的并且不会污染堆,但编译器无法证明这一点并且无法验证操作的正确性,因此它仍会产生警告。这实际上是未经检查的警告的定义:当无法验证涉及参数化类型的操作的正确性时。有关更多信息,请参阅有关不可重新生成类型的this Oracle页面。如果您不想收到此警告,可以使用SafeVarargs
阻止它,或者只是通过在方法声明中添加@SuppressWarnings ({"unchecked", "varargs"})
来禁止它,但您不会在事件中收到警告该方法确实不安全。