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

Posted

技术标签:

【中文标题】Java 1.7 varargs 函数报告为未经检查的警告【英文标题】:Java 1.7 varargs function reported as unchecked warning 【发布时间】:2012-06-26 11:57:35 【问题描述】:

我们使用了一些可变参数函数,当我们迁移到 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] 类型而不是未选中类型。

我错过了什么吗?

【问题讨论】:

我们能看到 ICache 和 SomeClass 的所有相关部分吗? 看看this official Oracle site,它详细解释了可变参数堆污染,Java 7 编译器为什么会发出警告以及如何抑制它。 这能回答你的问题吗? Possible heap pollution via varargs parameter 【参考方案1】:

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

【讨论】:

以上是关于Java 1.7 varargs 函数报告为未经检查的警告的主要内容,如果未能解决你的问题,请参考以下文章

Java 变长參数Varargs

Java varargs 可以为空吗? [复制]

Varargs Kotlin Java 互操作无法正常工作

java语言中的varargs

Kotlin vararg:如何将 null 设置为不抛出 NullPointerException 的 vararg?

打印外检报告单时,底盘动态细项判断都是“一”