SafeVarargs
Stay organized with collections
Save and categorize content based on your preferences.
A programmer assertion that the body of the annotated method or
constructor does not perform potentially unsafe operations on its
varargs parameter. Applying this annotation to a method or
constructor suppresses unchecked warnings about a
non-reifiable variable arity (vararg) type and suppresses
unchecked warnings about parameterized array creation at call
sites.
In addition to the usage restrictions imposed by its @Target
meta-annotation, compilers are required to implement
additional usage restrictions on this annotation type; it is a
compile-time error if a method or constructor declaration is
annotated with a @SafeVarargs
annotation, and either:
- the declaration is a fixed arity method or constructor
- the declaration is a variable arity method that is neither
static
nor final
.
Compilers are encouraged to issue warnings when this annotation
type is applied to a method or constructor declaration where:
Inherited Method Summary
From interface
java.lang.annotation.Annotation
abstract
Class<? extends Annotation>
|
|
abstract
boolean
|
equals( Object obj)
Returns true if the specified object represents an annotation
that is logically equivalent to this one.
|
abstract
int
|
hashCode()
Returns the hash code of this annotation, as defined below:
The hash code of an annotation is the sum of the hash codes
of its members (including those with default values), as defined
below:
The hash code of an annotation member is (127 times the hash code
of the member-name as computed by String.hashCode() ) XOR
the hash code of the member-value, as defined below:
The hash code of a member-value depends on its type:
|
abstract
String
|
toString()
Returns a string representation of this annotation.
|
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2024-07-10 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-07-10 UTC."],[[["\u003cp\u003e\u003ccode\u003e@SafeVarargs\u003c/code\u003e asserts that a method or constructor handles its varargs parameter safely, suppressing related unchecked warnings.\u003c/p\u003e\n"],["\u003cp\u003eIt can only be applied to \u003ccode\u003estatic\u003c/code\u003e or \u003ccode\u003efinal\u003c/code\u003e variable arity methods and constructors.\u003c/p\u003e\n"],["\u003cp\u003eWhile it suppresses warnings, \u003ccode\u003e@SafeVarargs\u003c/code\u003e doesn't guarantee type safety at runtime; potentially unsafe operations on varargs can still lead to exceptions like \u003ccode\u003eClassCastException\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eCompilers may issue warnings if \u003ccode\u003e@SafeVarargs\u003c/code\u003e is used on methods with reifiable element types (like \u003ccode\u003eObject\u003c/code\u003e or \u003ccode\u003eString\u003c/code\u003e) or if the method contains potentially unsafe operations on the varargs array.\u003c/p\u003e\n"]]],["The `@SafeVarargs` annotation asserts that a method or constructor doesn't perform unsafe operations on its varargs parameter. It suppresses unchecked warnings about non-reifiable vararg types and parameterized array creation. This annotation is restricted to varargs methods that are either `static` or `final`. Compilers may warn if applied to reifiable types or if unsafe operations are present, like assigning incompatible types to vararg array elements, which can lead to runtime exceptions. Future updates might mandate errors for such unsafe practices.\n"],null,["# SafeVarargs\n\npublic abstract @interface **SafeVarargs** implements [Annotation](../../../reference/java/lang/annotation/Annotation.html) \nA programmer assertion that the body of the annotated method or\nconstructor does not perform potentially unsafe operations on its\nvarargs parameter. Applying this annotation to a method or\nconstructor suppresses unchecked warnings about a\n*non-reifiable* variable arity (vararg) type and suppresses\nunchecked warnings about parameterized array creation at call\nsites.\n\nIn addition to the usage restrictions imposed by its [@Target](../../../reference/java/lang/annotation/Target.html) meta-annotation, compilers are required to implement\nadditional usage restrictions on this annotation type; it is a\ncompile-time error if a method or constructor declaration is\nannotated with a `@SafeVarargs` annotation, and either:\n\n- the declaration is a fixed arity method or constructor\n- the declaration is a variable arity method that is neither `static` nor `final`.\n\nCompilers are encouraged to issue warnings when this annotation\ntype is applied to a method or constructor declaration where:\n\n- The variable arity parameter has a reifiable element type, which includes primitive types, `Object`, and `String`. (The unchecked warnings this annotation type suppresses already do not occur for a reifiable element type.)\n- The body of the method or constructor declaration performs potentially unsafe operations, such as an assignment to an element of the variable arity parameter's array that generates an unchecked warning. Some unsafe operations do not trigger an unchecked warning. For example, the aliasing in\n \u003e\n \u003e ```\n \u003e @SafeVarargs // Not actually safe!\n \u003e static void m(List\u003cString\u003e... stringLists) {\n \u003e Object[] array = stringLists;\n \u003e List\u003cInteger\u003e tmpList = Arrays.asList(42);\n \u003e array[0] = tmpList; // Semantically invalid, but compiles without warnings\n \u003e String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime!\n \u003e }\n \u003e \n \u003e ```\n leads to a `ClassCastException` at runtime.\n\n Future versions of the platform may mandate compiler errors for\n such unsafe operations.\n\n\u003cbr /\u003e\n\n### Inherited Method Summary\n\nFrom interface [java.lang.annotation.Annotation](../../../reference/java/lang/annotation/Annotation.html) \n\n|----------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| abstract [Class](../../../reference/java/lang/Class.html)\\\u003c? extends [Annotation](../../../reference/java/lang/annotation/Annotation.html)\\\u003e | [annotationType](../../../reference/java/lang/annotation/Annotation.html#annotationType())() Returns the annotation type of this annotation. |\n| abstract boolean | [equals](../../../reference/java/lang/annotation/Annotation.html#equals(java.lang.Object))([Object](../../../reference/java/lang/Object.html) obj) Returns true if the specified object represents an annotation that is logically equivalent to this one. |\n| abstract int | [hashCode](../../../reference/java/lang/annotation/Annotation.html#hashCode())() Returns the hash code of this annotation, as defined below: The hash code of an annotation is the sum of the hash codes of its members (including those with default values), as defined below: The hash code of an annotation member is (127 times the hash code of the member-name as computed by [String.hashCode()](../../../reference/java/lang/String.html#hashCode())) XOR the hash code of the member-value, as defined below: The hash code of a member-value depends on its type: - The hash code of a primitive value *v* is equal to *WrapperType* .valueOf(*v*).hashCode(), where *WrapperType* is the wrapper type corresponding to the primitive type of *v* ([Byte](../../../reference/java/lang/Byte.html), [Character](../../../reference/java/lang/Character.html), [Double](../../../reference/java/lang/Double.html), [Float](../../../reference/java/lang/Float.html), [Integer](../../../reference/java/lang/Integer.html), [Long](../../../reference/java/lang/Long.html), [Short](../../../reference/java/lang/Short.html), or [Boolean](../../../reference/java/lang/Boolean.html)). |\n| abstract [String](../../../reference/java/lang/String.html) | [toString](../../../reference/java/lang/annotation/Annotation.html#toString())() Returns a string representation of this annotation. |"]]