gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:36 29 4
gpt4 key购买 nike

我有一些 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com