@SafeVarargs 是否适合此方法的注释?

Is @SafeVarargs an appropriate annotation for this method?

我有一些 Java 代码(使用 Guava ImmutableList class):

@Nonnull
public static <E extends Event> UserHistory<E> forUser(long id, E... events) {
    List<E> list = ImmutableList.copyOf(events);
    return new BasicUserHistory<E>(id, list);
}

我收到了像这样的方法附带的常见堆污染警告。由于我的方法没有对 events 进行任何修改,因此它不会 引入 堆污染。但是,如果(由于擦除)此方法的客户端使用错误的 events 数组调用它,它似乎可以通过自身传播堆污染。

如果我用 @SafeVarargs 注释它,我仍然会在其中收到警告(可以用 @SuppressWarnings("varargs") 抑制)。但是阅读关于 heap pollution 的 Java 文档,我有点不清楚这个方法的正确注释集。

我还注意到 ImmutableList.copyOf 而不是 标记为 @SafeVarargs(尽管这可能只是兼容性问题),但是 Arrays.asList是。

所以,我的问题是:@SafeVarargs 是否适合此方法的注释,因为它不会遇到 ClassCastException,但可能会将未正确检查的数组传播到最终参数化类型并允许在客户端代码中使用 ClastCastException?

我相信,基于 this answer,它是安全的,因为代码不会做任何取决于 events 本身类型的事情,只取决于其元素的类型。这是指南的正确应用吗?

是的,@SafeVarargs 应该是合适的,因为 events 唯一要做的就是将它传递给 ImmutableList.copyOf(),这(根据我对该方法的理解)确实不依赖于该数组的运行时类型。

ImmutableList.copyOf() 应该注解为@SafeVarargs,但是 它不是(可能是为了向后兼容,或者他们没有注意到)。当您的不可具体化的可变参数方法将可变参数参数传递给另一个可能取决于数组的运行时类型的方法时,然后(由于我不完全理解的原因,但这是 的主题)它给出你是那个电话的可变参数警告。这可以用 @SuppressWarnings("varargs").

来抑制