A typed language without parametric polymorphism needs to adopt one of the following substitutes.

  1. Type checking is fairly strong, and polymorphic definitions are not allowed. If you decide to create a type of linked lists, you can only create a list over a single type. For example, you can define a list of integers, or a list of strings, but you cannot define a general-purpose list type.

    This is the approach taken in Pascal, for example. In fact, Pascal is very restrictive. A function that sorts an array not only can only sort an array of one type of values, but it can only sort an array of a single physical size.

    It is difficult to write a general library of tools in Pascal.

  2. Compile-time type checking is weakened to allow some polymorphism. This is the approache taken in Java 1.1. You can create a list of any type of object, but what you get is a list of Objects. If you have a list of strings, you can only get a string out of the list by converting it from Object to String. That requires a run-time type check.

Parametric polymorphism allows polymorphism while keeping strong type checking.