Параметр универсального типа не скомпилирован в байт-код, поэтому он недоступен во время выполнения. ArrayList - это просто ArrayList во время выполнения.
Самое близкое, чего вы можете достичь, это добавить проверки во время выполнения самостоятельно. Например, класс Collections предоставляет декоратор , который делает именно это:
List l = Collections.checkedList(new ArrayList<String>(), String.class);
l.add("Jave uses erasure");
l.add(14);
Если список был создан просто как ArrayList , оба дополнения будут выполнены во время выполнения. Однако при реализации оболочки все дополнения элементов проверяются, поэтому второй вызов вызовет исключение ClassCastException.