Я никогда не использовал это на практике, но вы можете себе представить, как использовать это для безопасности типов. Рассмотрим следующий метод:
<T> void method(T... items) {
List<T> list = new ArrayList<T>();
for (T item : items)
list.add(item);
System.out.println(list);
}
Вы можете назвать это следующим образом:
o.<Object>method("Blah", new Long(0));
o.<Number>method(new Integer(100), new Long(0));
Но это вызовет ошибку компилятора:
o.<Number>method("String", new Long(0));
Таким образом, у вас есть общий метод, который является типичным и может использоваться для каждого объекта, не ограничиваясь парикулярным интерфейсом или классом.