Safe Varargs (original) (raw)
Gernot Neppert mcnepp02 at googlemail.com
Tue Jan 25 06:16:56 PST 2011
- Previous message: Safe Varargs
- Next message: Safe Varargs
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
When reading the documentation for SafeVarargs, there were 2 things that I found noteworthy:
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!
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.
- Previous message: Safe Varargs
- Next message: Safe Varargs
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]