public static void main(String[] args) {
test(1, 2);
test(1, 2L);
}
//@SafeVarargs
public static <T> void test(T... array) { // Warning: Possible heap pollution from parameterized vararg type
for (T arg : array) {
System.out.println(arg.getClass().getSimpleName() + " : " + arg);
}
}
原因
可变参数为泛型类型时,编译器发出的警告。若方法内部进行类型转换,可能会发生ClassCastException。
解释
这样会导致原本认为同一类型的多个可变参数,会出现类型不同的情况。比如测试代码中同时传递了Integer & Long不同类型的参数,那么编译器会进行类型推断,若二者都具有相同的抽象元素,则编译通过,否则编译失败。Integer & Long都为Number的子元素,故编译成功。
解决方式
- 方法上添加@SafeVarargs注解,表明开发者告诉编译器:可变参数为泛型类型时,内部不会发生类型转换异常。
- 将可变参数转为 T[] 的形式,这样类型一致的问题是调用时就处理好的。即使传递了类似这样的参数:new Object[] {1, “A”} 内部依旧有可能会发生转换异常,但这是在开发者知晓的情况下发生的。