Интерфейс аннотации SafeVarargs
@Documented @Retention(RUNTIME) @Target({CONSTRUCTOR,METHOD}) public @interface SafeVarargs В дополнение к ограничениям на использование, налагаемым мета-аннотацией @Target, компиляторы должны реализовывать дополнительные ограничения на использование этого типа аннотации; объявление метода или конструктора, аннотированное аннотацией @SafeVarargs, является ошибкой времени компиляции, если выполняется одно из следующих условий:
- объявление относится к методу или конструктору с фиксированной арностью
- объявление относится к методу с переменной арностью, который не является ни
static, ниfinal, ниprivate.
Компиляторам рекомендуется выдавать предупреждения, когда этот тип аннотации применяется к объявлению метода или конструктора, если:
- Параметр переменной арности имеет реифицируемый тип элементов, включая примитивные типы,
ObjectиString. (Предупреждения о непроверяемых операциях, подавляемые этим типом аннотации, не возникают для реифицируемого типа элементов.) - Тело объявления метода или конструктора выполняет потенциально небезопасные операции, например присваивание элементу массива параметра переменной арности, которое вызывает предупреждение о непроверяемой операции. Некоторые небезопасные операции не вызывают предупреждений о непроверяемых операциях. Например, алиасинг в
приводит к@SafeVarargs // Not actually safe! static void m(List<String>... stringLists) { Object[] array = stringLists; List<Integer> tmpList = Arrays.asList(42); array[0] = tmpList; // Semantically invalid, but compiles without warnings String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime! }ClassCastExceptionво время выполнения.В будущих версиях платформы такие небезопасные операции могут стать причиной ошибок компиляции.
- См. Спецификацию языка Java:
- 4.7 Реифицируемые типы
8.4.1 Формальные параметры
9.6.4.7 @SafeVarargs
- Начиная с версии:
- 1.7
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/SafeVarargs.html