您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

这是我的看法:

@SafeVarargs

@SuppressWarnings("varargs")

解决警告的方法[varargs] Varargs method Could cause heap pollution from non-reifiable varargs parameter bar

因此,如果我对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()代码的警告消失。

java 2022/1/1 18:25:18 有513人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶