Java 1.7 varargs函数报告为未经检查的警告
我们使用了一些varargs函数,当我们转向java 1.7时,我们得到了一个奇怪的未经检查的警告。
function在接口ICache中添加
public interface ICache { 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]类型不是未选中的类型。
我错过了什么吗?
堆污染是一个术语,指的是指向对象的类型,当使用具有generics类型的varargs时,它不是超类型。 当参数化类型的变量引用不是该参数化类型的对象时,就会发生这种情况。 关于堆栈溢出的这篇文章向您解释了这意味着什么以及您应该做些什么,并提供有关@SafeVarargs
注释的详细信息。 因此,在接口ICache
,vararg类型O
指向接口中的Object
,但O
不是Object
的超类型,这会产生堆污染警告。 注意它是如何说可能的堆污染。 如果您的代码没有导致任何问题,例如导致ClassCastException
,它可能是安全的并且不会污染堆,但是编译器无法certificate这一点并且无法validation操作的正确性,因此它仍然会生成警告。 这实际上是未经检查的警告的定义:当无法validation涉及参数化类型的操作的正确性时。 有关更多信息,请参阅此不可重复类型的Oracle页面。 如果您不想收到此警告,可以使用SafeVarargs
阻止它,或者通过将@SuppressWarnings ({"unchecked", "varargs"})
到方法声明中来禁止它,但是您不会收到警告该方法确实不安全的事件。