Friday, November 25, 2011

Java 7 : Type Inference for Generic Instance Creation

Previously when using generics you had to specify the type twice, in the declaration and the constructor;
List<String> strings = new ArrayList<String>();


In Java 7, you just use the diamond operator without the type;
List<String> strings = new ArrayList<>();  



If the compiler can infer the type arguments from the context, it does all the work for you. Note that you have always been able do a “new ArrayList()” without the type, but this results in an unchecked conversion warning.
Type inference becomes even more useful for more complex cases;
Before Java 7
Map<String, Map<String,int>> mS = new HashMap<String, Map<String,int>>();
Java 7
Map<String, Map<String, int> mS = new HashMap();
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<>());
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 compiles:
// The following statements compile:

List<? extends String> list2 = new ArrayList<>();
list.addAll(list2);


No comments:

Post a Comment