在这个问题上,我所看到的答案都没有一个令人满意,因此,我认为自己会对此持怀疑态度。
这是我的看法:
@SafeVarargs
@SuppressWarnings("varargs")
是解决警告的方法:[varargs] Varargs method Could cause heap pollution from non-reifiable varargs parameter bar
。
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()
的代码的警告消失。