Это зависит от того, как вы определяете дженерики. Параметрический полиморфизм - который позволяет вам определять функции и типы, которые не привязаны к определенным типам аргументов / полей - уже был в ML - и это 1973. Существует пример стандартной ML из Википедии:
fun reverse [] = []
| reverse (x::xs) = (reverse xs) @ [x]
Обратите внимание, что эта функция статически типизирована, но полиморфна («универсальна») в любом типе списка.
Хотя этот пример - SML (что позже), насколько я знаю, концепция присутствовала и в самых ранних версиях ML.