Safe Varargs

Joe Darcy joe.darcy at oracle.com
Mon Dec 13 15:17:08 PST 2010


Greetings.

Following up on earlier work, the javac team has pushed a new 
implementation of Project Coin's simplified varargs method invocation 
feature. [1] The changes are scheduled to appear in the promotion of JDK 
7 b123.

As envisioned previously, a new @Documented annotation type, 
java.lang.SafeVararags, can be used to suppress warnings related to 
unchecked warnings, both the new mandatory warnings at the declaration 
site of a varargs method/constructor with a non-reifiable element type 
and the existing unchecked warnings at the call sites of such methods. A 
systematic application of this annotation to appropriate declarations in 
the JDK libraries will follow as future work.

Since new unchecked warnings are being introduced, those diligently 
compiling with options like "-Xlint:unchecked -Werror" will see a build 
error under JDK 7 if any of the suspicious varargs method declarations 
are found. To address this, the @SafeVarargs annotation can be applied 
to the declarations, if appropriate, or the 
@SuppressWarnings({"unchecked", "varargs"}) annotation can be applied. 
Unlike @SafeVarargs, the @SuppressWarnings annotation will not squelch 
unchecked warnings at the call site of the annotated method.

The specification of the new SafeVarargs annotation type is below.

-Joe

[1] http://hg.openjdk.java.net/jdk7/tl/jdk/rev/78885e69c42c
http://hg.openjdk.java.net/jdk7/tl/langtools/rev/7b99f98b3035

-=-=-=-=-=-=-

Annotation Type SafeVarargs

    @Documented
    @Retention(value=RUNTIME)
    @Target(value={CONSTRUCTOR,METHOD})
    public @interface SafeVarargs

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:

        * 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