1 ) Строгий набор и функции, которые его поддерживают .
C # / Java v1.0 были языками со строгой типизацией, но иногда вам приходилось нарушать статическую типизацию, потому что просто не хватало выразительности, чтобы делать что-то и иметь статическую типизацию (т. Е. Вам требовалось приведение при извлечении объектов из нетипизированного коллекция например).
Обобщения, конечно, значительно улучшают ситуацию, и вещи становятся еще лучше в языках, которые поддерживают обобщения более высокого порядка (например, Scala).
2 ) Краткость. Если это очевидно, мне не нужно это писать. Вывод типа является отличным инструментом для этого.
3 ) Отличная библиотека. Если это часто нужно, мне не нужно это писать.