Является ли @SafeVarargs подходящей аннотацией для этого метода?

У меня есть немного кода 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")). Но, прочитав документацию Java на загрязнение кучи, я немного неясен относительно правильного набора аннотаций по этому методу.

Я также отмечаю, что ImmutableList.copyOf не помечен как @SafeVarargs (хотя это может быть просто проблема совместимости), но Arrays.asList есть.

Итак, мой вопрос: @SafeVarargs соответствующая аннотация для этого метода, учитывая, что он не встретится с ClassCastException, но может распространять неверно проверенный массив до конечного параметризованного типа и разрешить ClastCastException в клиентском коде?

Я полагаю, исходя из этого ответа, что это безопасно, поскольку код не делает ничего, что зависит от типа events, только на тип его элементов. Это правильное применение руководства?

Ответ 1

Да, @SafeVarargs должен быть уместным, потому что единственное, что делается с events, это передать его в ImmutableList.copyOf(), который (в моем понимании этого метода) не зависит от типа среды выполнения этого массив.

ImmutableList.copyOf() следует аннотировать с помощью @SafeVarargs, но это не (возможно, для обратной совместимости или они их не заметили). Когда ваш невосстанавливаемый метод varargs передает параметр varargs другому методу, который может потенциально зависеть от типа среды выполнения массива, тогда (по причинам, которые я не совсем понимаю, но является предметом этот вопрос) он дает вам предупреждение varargs для этого вызова. Это можно подавить с помощью @SuppressWarnings("varargs").