栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java警告:Varargs方法可能会导致来自不可修改的varargs参数的堆污染

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java警告:Varargs方法可能会导致来自不可修改的varargs参数的堆污染

在这个问题上,我所看到的答案都没有一个令人满意,因此,我认为自己会对此持怀疑态度。

这是我的看法:

  1. @SafeVarargs

    • 是解决警告的方法:
      [unchecked] Possible heap pollution from parameterized vararg type Foo
    • 是方法 约定的 一部分,因此注释为何具有运行时保留。
    • 向方法的调用者保证,该方法不会使用泛型varargs参数弄乱堆。
    • @SuppressWarnings("varargs")

    • 是解决警告的方法:

      [varargs] Varargs method could cause heap pollution from non-reifiable varargs parameter bar

    • 解决方法代码 发生的问题,而不是方法合同上的问题,因此注释为何仅保留源代码。
    • 告诉编译器无需担心方法代码 调用的被调用方方法会 使用由不可修改的varargs参数产生的数组将堆弄乱。

因此,如果我对OP的原始代码进行以下简单修改:

class Foo {    static <T> void bar(final T... barArgs) {        baz(barArgs);    }    static <T> void baz(final T[] bazArgs) { }}

$ javac -Xlint:all Foo.java
使用Java 9.0.1编译器的输出为:

Foo.java:2: warning: [unchecked] Possible heap pollution from parameterized vararg type T    static <T> void bar(final T... barArgs) {  ^  where T is a type-variable:    T extends Object declared in method <T>bar(T...)1 warning

我可以通过将标记

bar()
为来消除该警告
@SafeVarargs
。这既使得警告消失 ,并
通过增加可变参数安全的方法合同,确保任何人谁通话
bar
将不必抑制任何可变参数的警告。

但是,这也使Java编译器更加仔细地查看了方法代码本身-
我想是为了验证一些简单的情况,在这些情况下

bar()
可能违反了我刚刚订立的合同
@SafeVarargs
。而且它看到
bar()
所调用
baz()
传递
barArgs
和数据,因为
baz()
需要一个
Object[]
因类型擦除,
baz()
会搞乱了堆,从而导致
bar()
以传递地做到这一点。

因此,我还需要添加

@SuppressWarnings("varargs")
bar()
以使有关
bar()
的代码的警告消失。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414194.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号