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

2022-09-04 21:39:44

我有一些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);
}

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

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

我还注意到没有标记为(尽管这可能只是一个兼容性问题),但确实如此。ImmutableList.copyOf@SafeVarargsArrays.asList

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

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


答案 1

是的,应该是合适的,因为唯一要做的就是将其传递给 ,(在我对该方法的理解中)不依赖于该数组的运行时类型。@SafeVarargseventsImmutableList.copyOf()

ImmutableList.copyOf() 应该用 注释,但它不是(也许是为了向后兼容,或者他们没有注意到它)。当您的不可重用 varargs 方法将 varargs 参数传递给另一个可能依赖于数组的运行时类型的方法时,然后(出于我不完全理解的原因,但这是此问题的主题)它会针对该调用为您提供 varargs 警告。这可以通过 使用 来抑制。@SafeVarargs@SuppressWarnings("varargs")


答案 2