Самым большим преимуществом использования обобщений в вашем примере является то, что он превращает ошибку времени выполнения в ошибку времени компиляции.
List list = new ArrayList();
list.add(new Integer(42));
String hi = (String) list.get(0); // run time error
List<String> list = new ArrayList<String>();
list.add(new Integer(42)); // compile time error
String hi = list.get(0);
Поскольку ошибки времени выполнения видны пользователями, а ошибки времени компиляции - программистами, ошибки времени компиляции намного, намного лучше.
Чтобы ответить на ваш вопрос, не было бы никаких серьезных сбоев, если бы приведения производились автоматически (и ClassCastException все еще генерировался во время выполнения в вашем примере). Преимущество необходимости явного приведения заключается в том, что кодер должен думать о том, что он делает, и понимать, что происходит приведение.
Также есть случаи, когда
дженерики не могут быть использованы, потому что
коллекция может иметь другой объект
Вы можете добавлять различные объекты в общую коллекцию, используя подстановочные знаки.