可能通过 varargs 参数进行堆污染 [英] Possible heap pollution via varargs parameter

查看:34
本文介绍了可能通过 varargs 参数进行堆污染的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道在 Java 7 中使用具有泛型类型的可变参数时会发生这种情况;

I understand this occurs with Java 7 when using varargs with a generic type;

但我的问题是..

Eclipse 说它的使用可能会污染堆"究竟是什么意思?

What exactly does Eclipse mean when it says "its use could potentially pollute the heap?"

还有

新的 @SafeVarargs 注释如何防止这种情况发生?

How does the new @SafeVarargs annotation prevent this?

推荐答案

堆污染是一个技术术语.它指的是引用的类型不是它们指向的对象的超类型.

Heap pollution is a technical term. It refers to references which have a type that is not a supertype of the object they point to.

List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As

这可能会导致无法解释"ClassCastExceptions.

This can lead to "unexplainable" ClassCastExceptions.

// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0); 

@SafeVarargs 根本无法阻止这种情况.但是,有些方法可以证明不会污染堆,只是编译器无法证明.以前,此类 API 的调用者会收到令人讨厌的警告,这些警告完全没有意义,但必须在每个调用站点上进行抑制.现在API作者可以在声明站点取消一次.

@SafeVarargs does not prevent this at all. However, there are methods which provably will not pollute the heap, the compiler just can't prove it. Previously, callers of such APIs would get annoying warnings that were completely pointless but had to be suppressed at every call site. Now the API author can suppress it once at the declaration site.

但是,如果该方法实际上安全,用户将不再收到警告.

However, if the method actually is not safe, users will no longer be warned.

这篇关于可能通过 varargs 参数进行堆污染的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆