Java 7 introduced the Diamond1 to remove some boiler-plate around generic class instantiation. With Java 7+ you can write:
List<String> list = new LinkedList<>();
Where you had to write in previous versions, this:
List<String> list = new LinkedList<String>();
One limitation is for Anonymous Classes, where you still must provide the type parameter in the instantiation:
// This will compile:
Comparator<String> caseInsensitiveComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
// But this will not:
Comparator<String> caseInsensitiveComparator = new Comparator<>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
Although using the diamond with Anonymous Inner Classes is not supported in Java 7 and 8, it will be included as a new feature in Java 9.
Footnote:
1 - Some people call the <>
usage the "diamond operator". This is incorrect. The diamond does not behave as an operator, and is not described or listed anywhere in the JLS or the (official) Java Tutorials as an operator. Indeed, <>
is not even a distinct Java token. Rather it is a <
token followed by a >
token, and it is legal (though bad style) to have whitespace or comments between the two.
The JLS and the Tutorials consistently refer to <>
as "the diamond", and that is therefore the correct term for it.