Важливою особливістю параметричних типів є можливість запису поліморфних алгоритмів, тобто алгоритмів, які працюють на структурі даних незалежно від значення її параметра, наприклад Arrays.sort()
.
З дженериками це робиться з типовими символами:
<E extends Comparable<E>> void sort(E[]);
Щоб бути по-справжньому корисним, типи підстановок вимагають зйомки шаблонів, і це вимагає поняття параметра типу. Нічого з цього не було доступно під час додавання масивів до Java, а виготовлення масивів коваріанта опорного типу дозволяло набагато простішим способом дозволяти поліморфні алгоритми:
void sort(Comparable[]);
Однак ця простота відкрила лазівку в системі статичного типу:
String[] strings = {"hello"};
Object[] objects = strings;
objects[0] = 1; // throws ArrayStoreException
вимагає перевірки часу виконання кожного запису доступу до масиву посилальних типів.
Коротше кажучи, новіший підхід, що втілюється у дженериках, робить систему типів більш складною, але й більш статично безпечною, тоді як старший підхід був простішим та менш статичним. Дизайнери мови обрали більш простий підхід, який має зробити більш важливі речі, ніж закриття невеликої лазівки в системі типів, яка рідко створює проблеми. Пізніше, коли Java була створена, і нагальні потреби піклувалися, у них з'явилися ресурси, щоб зробити це правильно для генерики (але змінивши її для масивів, це порушило б існуючі програми Java).