This is incorrect; Ada has a wonderful generic system.
subprograms can be parametrized on a type (or other functions, ranges, tasks, values, packages, etc.), as can packages themselves; wikipedia has an entry about Ada's generic-system on it's generic programming page.
The consequence of the above is you can make programs with a high amount of safe reuse (decomposing common elements); for example:
Now some people think that the template/metaprogramming ability is more powerful than the generic facility of Ada because it is Turing-complete; this is actually quite a step backward WRT safety -- because it is Turing-complete you can state your problem in the template itself, which is not guaranteed to finish (precisely because it is Turing-complete).
Sorry. I was discussing languages people actually use.