Упомянутый «недостаток обобщений» относится к тому факту, что API предоставляет неуниверсальные методы и классы, то есть методы, которые работают на Object
и обычно вынуждают пользователя использовать приведение типов и теряют некоторую безопасность типов. Универсальные API имеют параметры типов и работают с объектами этих типов без необходимости приведения и поддержания безопасности типов во время компиляции. Сравните с использованием ArrayList
с использованием ArrayList<T>
:
// Non-generic (before Java 5)
ArrayList l = /*...*/;
Foo x = (Foo) l.get(42);
l.add(new Bar()); // Compiler is fine with this
// Generic (from Java 5 onwards)
ArrayList<Foo> l = /*...*/;
Foo x = l.get(42);
l.add(new Bar()); // Compiler complains that you can't add Bar to a list of Foo