Program to demonstrate Java 7 new feature : Using the @SafeVarargs annotation.
Output of the program :
package com.hubberspot.java7; import java.util.ArrayList; import java.util.List; public class SafeVarargsAnnotation { public static void main(String[] args) { // Scenario 1 - // Prior to Java 7, usage of code without @SafeVarargs withoutSafeVarargsAnnotation(); // Scenario 2 - // After Java 7, usage of code with @SafeVarargs withSafeVarargsAnnotation(); } private static void withoutSafeVarargsAnnotation() { List< Integer > listOfIntegers = new ArrayList< >(); listOfIntegers.add(1); listOfIntegers.add(2); listOfIntegers.add(3); listOfIntegers.add(4); List< Float > listOfFloats = new ArrayList< >(); listOfFloats.add(3.0f); listOfFloats.add(1.0f); listOfFloats.add(2.0f); listOfFloats.add(3.2f); // Calling of a method that takes in a generic type of // variable arguments without usage of @SafeVarargs // It generates a warning for the developer for the type safety as // Type safety: A generic array of List< ? extends Number&Comparable< ? > > // is created for a varargs parameter displaywithoutSafeVarargs(listOfIntegers , listOfFloats); } // Also throws a warning for // Type safety: Potential heap pollution via varargs parameter lists private static < T > void displaywithoutSafeVarargs(T... lists) { for(T element : lists) { System.out.println("Display of elements without @SafeVarargs Annotation"); System.out.println(element.getClass().getName() + ": " + element); } } private static void withSafeVarargsAnnotation() { List< Integer > listOfIntegers = new ArrayList< >(); listOfIntegers.add(1); listOfIntegers.add(2); listOfIntegers.add(3); listOfIntegers.add(4); List< Float > listOfFloats = new ArrayList< >(); listOfFloats.add(3.0f); listOfFloats.add(1.0f); listOfFloats.add(2.0f); listOfFloats.add(3.2f); displaywithSafeVarargs(listOfIntegers , listOfFloats); } // With usage of @SafeVarargs the Type Safety warning has been // supressed @SafeVarargs private static < T > void displaywithSafeVarargs(T... lists) { System.out.println(); for(T element : lists) { System.out.println("Display of elements with @SafeVarargs Annotation"); System.out.println(element.getClass().getName() + ": " + element); } } }
Output of the program :