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

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

我们使用了一些可变参数函数,当我们迁移到 java 1.7 时,我们收到了一个奇怪的未经检查的警告。

接口(interface)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 extends Object,作为它的通用缓存类。

我阅读了 xlint 警告,我们确实在未选中的情况下进行了编译,但是 http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示此错误应该是 [varargs] 类型而不是未经检查的类型。

我错过了什么吗?

最佳答案

堆污染是一个术语,指的是指向一个对象的类型,当使用具有泛型类型的可变参数时,它不是父类(super class)型。当参数化类型的变量引用不属于该参数化类型的对象时,就会发生这种情况。 This stack overflow 上的帖子向您准确解释了这意味着什么以及您应该如何处理它,并提供了有关 @SafeVarargs 注释的详细信息。因此,在接口(interface) ICache 中,可变参数类型 O 指向接口(interface)中的 Object,但 O 不是Object 的父类(super class)型,这会生成堆污染警告。注意它是如何说可能堆污染的。如果您的代码没有引起任何问题,例如导致 ClassCastException,它可能是安全的并且不会污染堆,但编译器无法证明这一点,也无法验证操作的正确性,因此它仍会生成警告。这实际上是未检查警告的定义:当无法验证涉及参数化类型的操作的正确性时。参见 this有关非具体化类型的 Oracle 页面以获取更多信息。如果你不想收到这个警告,你可以用 SafeVarargs 来阻止它,或者简单地通过添加 @SuppressWarnings ({"unchecked", "varargs"}) 来抑制它> 方法声明,但如果该方法确实不安全,您将不会收到警告。

关于Java 1.7 varargs 函数报告为未检查警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11185774/

相关文章:

java - 如何关闭 h2 内存数据库?

java - 当 similarly if-else 增长时应该使用什么设计模式?

java - 更改背景颜色可编辑的 JComboBox

java - 使用模块时如何修补 package-info.java 文件?

使用 setcap 功能运行时 JLI_InitArgProcessing 的 Java "symbol lookup error"

java - CompilationTask.call() 引入了 ClassNotFoundException。在 JDK6 中工作,不在 JDK7 中工作

java - 如何使用命令提示符更新 JAVA SDK

java - 扩展 Javac 解析器行为

linux - Bash java自动编译器

java - 根据出现次数拆分字符串