Обобщения присутствуют только во время компиляции, они будут удалены компилятором (это называется стиранием типов). Они предназначены для предоставления некоторой информации о типе компилятору. Это помогает вам избежать приведения типов (как обычно до Java 1.5) и позволяет компилятору для большей проверки типов. Это также ценная информация для программиста, например, если вы видите универсальный тип в интерфейсе.
Без генериков:
ArrayList list = new ArrayList();
Таким образом, это будет иметь значение, если вы напишите:
ArrayList</*Any type here*/> list = new ArrayList<>();
Теперь у компилятора есть информация о типах объектов list
.
Но эта версия не имеет никакого значения для версии без генериков:
ArrayList list = new ArrayList</*Any type here*/>();
Список переменных не сопровождается обобщенной информацией, поэтому он так же хорош (или плох), как и версия без обобщений.