当前位置: 首页 > 面试题库 >

通过varargs参数可能导致堆污染

梁鸿风
2023-03-14
问题内容

我知道在Java 7中使用带有泛型类型的varargs时会发生这种情况。

但是我的问题是..

Eclipse说“使用它可能会污染堆”时,这到底是什么意思?

@SafeVarargs注释如何防止这种情况?


问题答案:

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

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

这可能会导致“无法解释” ClassCastException

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

@SafeVarargs完全不能阻止这一点。但是,有些方法证明不会污染堆,编译器无法证明这一点。以前,此类API的调用者会收到烦人的警告,这些警告是毫无意义的,但必须在每个调用站点中都加以抑制。现在,API作者可以在声明站点中将其取消一次。

但是,如果方法其实并不安全,用户将不再被警告。



 类似资料:
  • 我知道Java 7在使用泛型类型的varargs时会出现这种情况; 但我的问题是.. 当Eclipse说“它的使用可能会潜在地污染堆”时,它到底是什么意思? 而且 新的注释如何防止这种情况发生?

  • 问题内容: 我在JDK 1.8上将IntelliJ IDEA与javac一起使用。我有以下代码: IntelliJ IDEA不会在上面的代码中突出显示任何内容作为警告。但是,在编译时,以下行将显示在“消息”视图的“生成”选项卡中: 警告:(L,C)java:Varargs方法可能会导致不可修改的varargs参数varargs造成堆污染 注意#1:我已经指定了。 注意#2:指向作为参数传递给 假设

  • 此问题特定于将varargs与泛型一起使用: 为什么我会得到这个警告如果我像下面这样定义方法: 与此相反的是: 因此,在声明方法之前,我应该注意什么? 此问题类似于以下关于,但这些答案中显示的方案似乎不适用于: null null 这就是我试图污染堆的原因,但是每次错误的尝试都会导致而不是污染数组。 我使用的是Eclipse4.6.0和Java JDK8U74。

  • 描述 HTTP 参数污染,或者 HPP,在网站接受用户输入,将其用于生成发往其它系统的 HTTP 请求,并且不校验用户输出的时候发生。它以两种方式产生,通过服务器(后端)或者通过客户端。 在 StackExchange 上,SilverlightFox 提供了一个 HPP 服务端攻击的不错的例子。假设我们拥有以下站点:https://www.example.com/transferMoney.ph

  • 但是,如果Terminal中没有提供,我不知道如何(或者是否能够)为其设置默认值。像这样简单的东西不起作用。这里的一个解决方案是根据的内容或大小在函数中设置变量。但我不知道有没有更好的办法做到这一点。 因此,我正在寻找一种方法来使用来自终端的参数调用一个函数,其中需要一个数字(在本例中为2),而其余的是可选的,并设置为默认值。

  • 我试图通过eclipse导出一个java程序,但我有一些问题: 我希望能够通过命令行运行它并将参数传递给它,特别是属性文件的位置。 我尝试将其导出为可运行的jar文件,使用main作为启动配置,并使用另一个运行配置,其中参数在运行时传递。 基本上我想传递属性文件ie但我一直收到以下错误: 有趣的是,如果我使用变量而不是,在那里我不需要传递参数,我会得到同样的错误。 在eclipse中,我可以将文件