我正在阅读甲骨文的https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html#vulnerabilities
其中提到
在方法ArrayBuilder.addToList中,编译器翻译 varargs形式参数T ...形式参数T []的元素 元素,一个数组。但是,由于类型擦除,编译器 将varargs形式参数转换为Object []元素。 因此,有堆污染的可能性。
我尝试了以下方法签名;
static <T> void varargsOfTypeParameter(T... varargs) { // compile warning as expected
}
而
static <T> void arrayOfTypeParameter(T[] array) { // no compile warning
}
在两种情况下,类型擦除后,T...
和T[]
都变为Object[]
,因此在两种情况下都存在潜在的堆污染。但是,只有在第一种情况下才会出现编译器警告,而在后一种情况下则没有警告。
为什么会这样?我想念什么吗?