У меня есть немного кода 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
, только на тип его элементов. Это правильное применение руководства?