Nei*_*man 16 java javac variadic-functions java-7 heap-pollution
我们使用了一些varargs函数,当我们转向java 1.7时,我们得到了一个奇怪的未经检查的警告.
功能在接口ICache中添加
public interface ICache<O> {
void add(Object source, O... objects);
}
Run Code Online (Sandbox Code Playgroud)
在界面中报告错误.
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
Run Code Online (Sandbox Code Playgroud)
O扩展了Object,作为其通用缓存类.
我阅读了xlint警告并且我们在未经检查的情况下编译,但是http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示这个错误应该是[varargs]类型不是未经检查的类型.
我错过了什么吗?
堆污染是一个术语,指的是当将可变参数与泛型类型一起使用时,该类型指向的对象不是其超类型。当参数化类型的变量引用不属于该参数化类型的对象时,就会发生这种情况。这篇关于堆栈溢出的文章向您准确解释了这意味着什么以及您应该采取什么措施,并提供了有关@SafeVarargs
注释的详细信息。因此,在 interface 中ICache
, vararg 类型O
指向Object
您的接口,但O
不是 的超类型Object
,这会生成堆污染警告。注意它是如何说可能的堆污染的。如果您的代码没有引起任何问题,例如导致 a ClassCastException
,它可能是安全的并且不会污染堆,但编译器无法证明这一点并且无法验证操作的正确性,因此它仍然会生成警告。这实际上是未经检查的警告的定义:当涉及参数化类型的操作的正确性无法验证时。有关更多信息,请参阅有关不可具体化类型的 Oracle 页面。如果您不想收到此警告,可以使用 来阻止它SafeVarargs
,或者只是通过添加到@SuppressWarnings ({"unchecked", "varargs"})
方法声明来抑制它,但如果该方法确实不安全,您将不会收到警告。
归档时间: |
|
查看次数: |
6249 次 |
最近记录: |