1.5.  Use the diamond operator with generic declarations

[Note]

You can replace the type arguments required to invoke the constructor of a generic class with an empty set of type parameters (<>) as long as the compiler can infer the type arguments from the context. This pair of angle brackets is informally called the diamond.

For example, consider the following variable declaration:


Map<String, List<String>> myMap = new HashMap<String, List<String>>();

					

In Java SE 7, you can substitute the parameterized type of the constructor with an empty set of type parameters (<>):


Map<String, List<String>> myMap = new HashMap<>();

					

Note that to take advantage of automatic type inference during generic class instantiation, you MUST specify the diamond. In the following example, the compiler generates an unchecked conversion warning because the HashMap() constructor refers to the HashMap raw type, not the Map<String, List<String>> type:


Map<String, List<String>> myMap = new HashMap(); // unchecked conversion warning

					

Java SE 7 supports limited type inference for generic instance creation; you can only use type inference if the parameterized type of the constructor is obvious from the context. For example, the following example DOES NOT compile:


List<String> list = new ArrayList<>();
list.add("A");

// The following statement should fail since addAll expects Collection<? extends String>

list.addAll(new ArrayList<>()); // Compilations fails !!!

					

Note that the diamond often works in method calls; however, it is suggested that you use the diamond primarily for variable declarations.

In comparison, the following example successfully compiles:


List<String> list = new ArrayList<>();
list.add("A");

List<? extends String> list2 = new ArrayList<>(); // NOT very practical ;-)
list.addAll(list2);                               // OK, it expects Collection<? extends String>

					

The compiler infers the type on the right side. So if you have a List of ?, the compiler will infer a list of Object:


List<?> list = new ArrayList<>();

					

Professional hosting         Free 'Oracle Certified Expert Web Services Developer 6' Guide     Free SCDJWS 5.0 Guide