我们使用了一些varargs函数,当我们迁移到java1.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警告,我们确实在未选中的情况下进行了编译,但http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示这个错误应该是varargs类型,而不是未选中的类型。
我是不是遗漏了什么?
发布于 2014-07-30 23:28:56
堆污染是一个术语,指的是在将varargs与泛型类型一起使用时,指向的对象不是其超类型的类型。当参数化类型的变量引用不属于该参数化类型的对象时,就会发生这种情况。关于堆栈溢出的This post准确地向您解释了这意味着什么,以及您应该如何处理它,并提供了有关@SafeVarargs
注释的详细信息。因此,在接口ICache
中,变量类型O
指向接口中的Object
,但O
不是Object
的超类型,这会生成堆污染警告。注意它是如何显示possible堆污染的。如果您的代码没有引起任何问题,例如导致ClassCastException
,那么它可能是安全的,并且不会污染堆,但是编译器无法证明这一点,也无法验证操作的正确性,因此它仍然会生成警告。这实际上是未检查警告的定义:当涉及参数化类型的操作的正确性无法验证时。有关更多信息,请参阅this Oracle中关于不可注册类型的页面。如果你不想得到这个警告,你可以用SafeVarargs
阻止它,或者简单地通过在方法声明中添加@SuppressWarnings ({"unchecked", "varargs"})
来禁止它,但是如果这个方法确实不安全,你就不会得到这个警告。
https://stackoverflow.com/questions/11185774
复制相似问题