在这个问题上,我所看到的答案都没有一个令人满意,因此,我认为自己会对此持怀疑态度。
这是我的看法:
@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()的代码的警告消失。



