首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 1.7 varargs函数报告为未经检查的警告

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

Stack Overflow用户
提问于 2012-06-25 16:26:31
回答 1查看 6.6K关注 0票数 16

我们使用了一些varargs函数,当我们迁移到java1.7时,我们得到了一个奇怪的未经检查的警告。

接口ICache中的函数插件

代码语言:javascript
复制
public interface ICache<O> {
    void add(Object source, O... objects);
}

在接口中报告错误。

代码语言:javascript
复制
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类型,而不是未选中的类型。

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2014-07-30 23:28:56

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11185774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档