Java 1.7 varargs函数报告为未检查警告[英] Java 1.7 varargs function reported as unchecked warning

问题描述

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

我错过了什么吗?

推荐答案

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

本文地址:https://www.itbaoku.cn/post/978720.html