Another name for function or operator Overloading.
When a function or data type is generic and handle values of different types in the same; for instance,
List<T> – a list with elements of an arbitrary type. The specific type in question is often given as a parameter, hence the name.
When an object belonging to a subtype can be used in a place where the supertype is expected (as with classes and inheritance in Object-oriented programming).