Safe Varargs (original) (raw)

Gernot Neppert mcnepp02 at googlemail.com
Tue Jan 25 06:16:56 PST 2011


When reading the documentation for SafeVarargs, there were 2 things that I found noteworthy:

  1. the distinction between mandatory compiler errors and recommended warnings seems somehow arbitrary: Why is the use of @SafeVarags on a method with reifiable variable-arity parameter not an error? Annotating such a method makes no more sense than annotating a method with fixed-arity!

  2. On the contrary, the sentence 'Future versions of the platform may mandate compiler errors for such unsafe operations.' smells fishy: this would result in code that is perfectly safe as verified by the programmer to become illegal in a future version. The reason is that the compiler cannot possibly determine whether a 'potentially unsafe' operation is, in fact, unsafe. You need only have a look at java.util.Arrays.asList(T.. A) to see this:

@SafeVarargs public static List asList(T... a) { return new ArrayList(a); }

This would warrant a compiler warning since passing the variable-arity parameter to another method as an array is 'potentially unsafe'. It would be wrong, however, to reject the code 'in a future version'.

2011/1/25 Joe Darcy <joe.darcy at oracle.com>:

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:  * 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.)  * 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.  Future versions of the platform may mandate compiler errors for such unsafe operations.



More information about the coin-dev mailing list