Java 这是一堆污染工作吗?

Java 这是一堆污染工作吗?,java,generics,variadic-functions,heap-pollution,Java,Generics,Variadic Functions,Heap Pollution,我有一个如下的构造函数 public MyConstructor(MyObject<T> ... objects) { // ... } 公共MyConstructor(MyObject…对象){ // ... } Eclipse警告我以下消息: 类型安全:通过varargs参数对象的潜在堆污染 我像这样更改构造函数: public MyConstructor(MyObject<T>[] objects) { // ... } 公共MyConst

我有一个如下的构造函数

public MyConstructor(MyObject<T> ... objects) {
     // ...
}
公共MyConstructor(MyObject…对象){
// ...
}
Eclipse警告我以下消息:

类型安全:通过varargs参数对象的潜在堆污染

我像这样更改构造函数:

public MyConstructor(MyObject<T>[] objects) {
     // ...
}
公共MyConstructor(MyObject[]对象){ // ... } 现在,警告消失了。然而,我认为潜在的危险并没有得到解决

这种变通方法有效吗

但是,由于类型擦除,编译器会转换varargs
对象[]
元素的形式参数。因此,存在一个问题 堆污染的可能性

正如我们所知,这个警告的原因主要是基于类型擦除,现在Java文档中已经明确说明了这一点

如果确保代码编译时没有警告,则不会发生堆污染。

还有更多关于这个

编译器在翻译时已生成警告 varargs形式参数<代码>列表。。。l到形式参数
列表[]l
此声明有效;变量l的类型为
列表[]
, 它是
对象[]
的子类型

所以

因此,编译器不会发出警告或错误,如果 将任何类型的列表对象指定给 objectArray数组


所有引用的语句都是从Java文档中复制的,这是一种变通方法。创建不可恢复组件类型的数组是不安全的。因此,编译器不允许这样的数组创建表达式:

// List<String> is erased to List => disallowed
Object example = new List<String>[] { null, null };

// List<?> is effectively reifiable => allowed
Object example = new List<?>[] { null, null };
由于您不允许创建此数组,因此堆不能再被污染。但是:你怎么称呼这个构造函数呢

请注意,构造函数可能根本不会污染堆。唯一的办法就是

  • 它将数组转换为不太特定的类型(即
    MyObject[]
    Object[]
    )或
  • 它让数组以某种方式逃逸(即,将其分配给字段并从getter返回,或将其传递给可能不安全的方法)
如果两者都不做,则可以将构造函数标记为具有
@SafeVarargs
,警告将消失。

MyObject。。。对象
MyObject[]对象
行为相似,但它们不相同。。。
// RHS amounts to Arrays.asList(new List<String>[] { null, null })
List<List<String>> example = Arrays.asList(null, null);