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

标签 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);
}

我收到了像这样的方法附带的常见堆污染警告。由于我的方法没有对 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注解,但是 它不是(可能是为了向后兼容,或者他们没有注意到)。当您的不可具体化的可变参数方法将可变参数参数传递给另一个可能取决于数组的运行时类型的方法时,然后(由于我不完全理解的原因,但这是 this question 的主题)它会给你一个该调用的可变参数警告。这可以用 @SuppressWarnings("varargs") 来抑制。

关于java - @SafeVarargs 是否适合此方法的注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130262/

相关文章:

c++ - 根据函数指针参数拆分多个可变参数模板包

c# - 为什么 params 'less performant' 不是常规数组?

Swift: Overriding Self-requirement 是允许的,但会导致运行时错误。为什么?

Typescript基于鉴别器的窄参数类型

Java:如何区分 wait() 中的虚假唤醒和超时

java - 什么是自动可执行 jar?

c++ - 接受记录器的可变数量的参数

c# - 为什么我不能从 long 派生?

java - 当软件第一次在该系统中运行时,如何使用java显示该软件的对话框

java - JPA EntityManager限制数据库上的并发操作数