Java 1.7 varargs 函数报告为未选中警告

我们使用一些 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警告,我们确实在未选中的情况下进行编译,但 http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings 似乎暗示此错误应该是[varargs]类型而不是未经检查的类型。

我错过了什么吗?


答案 1

堆污染是一个术语,它指的是在将 varargs 与泛型类型一起使用时指向的对象的类型,该对象不是该对象的超类型。当参数化类型的变量引用不属于该参数化类型的对象时,就会发生这种情况。篇关于堆栈溢出的文章向您解释了这的确切含义以及您应该对此做些什么,并提供了有关注释的详细信息。因此,在接口 中 vararg 类型指向您的接口中,但不是 的超类型,这会产生堆污染警告。注意它是如何说可能的堆污染的。如果你的代码没有引起任何问题,例如导致,它可能是安全的,不会污染堆,但编译器没有办法证明这一点,也无法验证操作的正确性,所以它仍然会生成警告。这实际上是未检查警告的定义:当无法验证涉及参数化类型的操作的正确性时。有关详细信息,请参阅 Oracle 页面,了解不可重用类型。如果您不想收到此警告,可以使用 来阻止它,或者只是通过添加到方法声明来禁止它,但是在方法确实不安全的情况下,您将不会收到警告。@SafeVarargsICacheOObjectOObjectClassCastExceptionSafeVarargs@SuppressWarnings ({"unchecked", "varargs"})


答案 2