Safe Varargs
Joe Darcy
joe.darcy at oracle.com
Mon Jan 24 22:59:45 PST 2011
FYI, I've pushed a changset [1] to annotate four core library methods
with @SafeVarargs:
* public static <T> List<T> java.util.Arrays.asList(T... a)
* public static <T> boolean
java.util.Collections.addAll(Collection<? super T> c, T... elements)
* public static <E extends Enum<E>> java.util.EnumSet<E>
EnumSet.of(E first, E... rest)
* protected final void javax.swing.SwingWorker.publish(V... chunks)
I've also posted a description of the methodology used to find candidate
methods to be so annotated [2].
-Joe
[1] http://hg.openjdk.java.net/jdk7/tl/jdk/rev/dbfc1e419cb2
[2] "Project Coin: Safe Varargs in JDK Libraries"
http://blogs.sun.com/darcy/entry/project_coin_safe_vararg_libraries
On 12/13/2010 3:17 PM, Joe Darcy wrote:
> 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