Solution (source code)

= Solution

<Programming language polymorphism> lets one expression or operation work with values of different types or concrete representations. In <object-oriented programming>, <subtype polymorphism> lets a reference of an interface or superclass type designate instances of different implementing <software classes>. A call through that reference uses <dynamic dispatch> to select the receiver's overriding <object method>. For example, a routine taking `Book` can invoke `recall` on a linked-list or an array-based implementation while depending only on the common abstract contract.

<Parametric polymorphism> is another form: the type parameter in `FiniteDist[T]` lets the same interface describe distributions over <Booleans>, <integers> or characters. A generic method introduces a further type parameter when its output type differs. <Method overloading>, in contrast, supplies several statically selected signatures with one name; it should not be confused with receiver-dependent <dynamic dispatch>. Correct substitutability also requires implementations to respect the common behavioral contract, not merely to share method names.