varargs
method with a non-reifiable varargs type, the compiler generates a warning on the calling statement. Consider the code:
//varargs method public static <T> void print(T... a) { for (T t : a) { System.out.println(t); } } //calling method public static void main(String[] args){ print("Hello", "World"); //this is fine print(new Pair<Integer,String>(1,"One"), new Pair<Integer,String>(2,"Two")); //WARNING: Type safety : A generic array of Pair<Integer,String> //is created for a varargs parameter }This because the compiler tries to create an array of
Pair<Integer,String>[]
to hold the varargs, which is not permitted because Pair<Integer,String>
is type erased at runtime to just Pair
. (More information here.) To suppress this warning, you need to add @SuppressWarnings("unchecked")
to each method which makes a call to the varargs method.
In JDK7, the warning has been moved from the call site to the varargs method declaration and you can annotate the varargs method with @SafeVarargs
in order to suppress it. This reduces the total number of warnings reported and those that have to be suppressed.
@SafeVarargs // WARNING SUPPRESSED: Type safety: Potential heap pollution via varargs parameter a public static <T> void print(T... a) { for (T t : a) { System.out.println(t); } } public static void main(String[] args){ print("Hello", "World"); print(new Pair<Integer,String>(1,"One"), new Pair<Integer,String>(2,"Two")); //no warnings :) }You can see this annotation used in JDK7's
Arrays.asList
method:
@SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }Eclipse support:
Quick fix gives you the option to Add @SafeVarargs to your method. Further Reading:
Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods
Well explained, thanks.
ReplyDelete