Java 1.7 varargs函数报告为未经检查的警告

时间:2012-06-25 08:26:31

标签: java java-7 javac variadic-functions heap-pollution

我们使用了一些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]类型而不是未经检查的类型。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

堆污染是一个术语,指的是指向对象的类型,当使用具有泛型类型的varargs时,它不是超类型。当参数化类型的变量引用不是该参数化类型的对象时,就会发生这种情况。关于堆栈溢出的This帖子向您解释了这意味着什么以及您应该对此做些什么,并提供有关@SafeVarargs注释的详细信息。因此,在接口ICache中,vararg类型O指向接口中的Object,但O不是Object的超类型,这会生成堆污染警告。请注意它是如何表示可能堆污染。如果您的代码没有导致任何问题,例如导致ClassCastException,它可能是安全的并且不会污染堆,但编译器无法证明这一点并且无法验证操作的正确性,因此它仍会产生警告。这实际上是未经检查的警告的定义:当无法验证涉及参数化类型的操作的正确性时。有关更多信息,请参阅有关不可重新生成类型的this Oracle页面。如果您不想收到此警告,可以使用SafeVarargs阻止它,或者只是通过在方法声明中添加@SuppressWarnings ({"unchecked", "varargs"})来禁止它,但您不会在事件中收到警告该方法确实不安全。