Génericité
Jusqu'à présent, une classe définissait un type unique. La généricité permet de définir une famille de types (souvent des conteneurs: piles, listes, tableaux ... ) ou, plus formellement, des types paramétrés. La généricité est partiellement disponible en C++ via les templates, mais absente en Java et Smalltalk. Examinons un extrait de la classe générique ARRAY, qui fait partie de la bibliothèque de base du langage et qui implante les tableaux d'objets de toutes sortes.

Cette classe est paramètrée par une variable de type générique G. Dans le contexte de la classe ARRAY, le type formel des éléments du tableau est G. Ainsi, la méthode item, qui accède à l'élément i du tableau, renvoie un objet de type G. Lors de la déclaration d'une variable (locale ou attribut) de type tableau, le paramètre formel G est remplacé par un paramètre correspondant à un type réel, concret. Par exemples:
ARRAY[INTEGER]
ARRAY[ARRAY[STRING]]
On obtient ainsi de nouveaux types, sans avoir à écrire de nouvelle classe. Le code de la classe ARRAY écrit, débogué et optimisé une seule fois devient (ré)utilisable dans de multiples contextes pour un coût de développement constant. Une classe peut bien entendu être paramétrée par plusieurs types, comme nous allons le voir sur un exemple particulier de la généricité : la généricité contrainte.