Reusable typed code.
WHAT THEY PROVIDE
Code working with any type, while remaining type checked.
WHY THEY EXIST
Without them, you either duplicate code per type or abandon type safety.
WHAT THAT LOOKS LIKE
A collection holding any type, with the compiler knowing which.
WHAT CONSTRAINTS DO
Limit which types may be used, so operations on them are valid.
WHY THAT MATTERS
A function sorting items requires those items to be comparable.
WHAT VARIES BETWEEN LANGUAGES
Whether type information survives to runtime Whether separate code is generated per type How constraints are expressed
WHY THAT FIRST POINT MATTERS
Where types are erased, the runtime cannot distinguish them.
WHAT THAT PREVENTS
Behaviour depending on the specific type at runtime.
WHAT TO BE CAREFUL WITH
Generic code so abstract nobody can read it Constraints so complex the error messages become unintelligible
WHAT TO PREFER
The simplest generic signature that works.
WHEN TO USE THEM
When you genuinely need the same logic for several types.
WHEN NOT TO
For one type, where a concrete implementation is clearer.