@SafeVarargs是否适合此方法?

Mic*_*and 10 java variadic-functions type-safety

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

我得到了通常的堆污染警告,这种警告来自这样的方法.由于我的方法没有做任何修改events,所以不能引入堆污染.但是,如果(因为擦除)此方法的客户端使用错误的events数组调用它,它似乎可以通过自身传播堆解决方案.

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

我也注意到,ImmutableList.copyOf没有标记为@SafeVarargs(尽管这可能仅仅是一个兼容性问题),但是Arrays.asList是.

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

我相信,基于这个答案,它是安全的,因为代码不会做任何取决于events它自身类型的东西,只取决于它的元素类型.这是指导的正确应用吗?

new*_*cct 11

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

ImmutableList.copyOf() 应该注释@SafeVarargs,但它不是(可能是向后兼容或他们没有注意到它).当你的不可恢复的varargs方法将varargs参数传递给另一个可能依赖于数组的运行时类型的方法时,那么(由于我不完全理解的原因,但是这个问题的主题),它会给你一个varargs警告该电话.这可以用来抑制@SuppressWarnings("varargs").