Интерфейс аннотаций 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 Формальные параметры
@SafeVarargs
- С:
- 1.7
© 1993, 2023, 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/21/docs/api/java.base/java/lang/SafeVarargs.html