= Solution
Instantiate the two <type parameters> and implement the <function> <object interface>:
``
val square: Fun[Int, Int] = new Fun[Int, Int] {
override def apply(x: Int): Int = x * x
}
``
\b[<Parametric polymorphism>] occurs because the generic <trait> is specialized by choosing its argument and result types. \b[<Subtype polymorphism>] occurs because the anonymous implementing <software class> is used through a `Fun[Int, Int]` reference; calls to its `apply` operation use the <object interface> contract and <dynamic dispatch>. <Multiplication> itself is not the second polymorphism needed for this explanation.
For values whose mathematical squares fit in a signed 32-bit <integer>, the result is the ordinary square. Outside that range, the supplied <integer> return type cannot represent every mathematical square, and the <multiplication> follows <Scala> integer-overflow behavior. An implementation requiring exact mathematical results for all <integer> inputs would need a wider result type or an explicit overflow exception.
Back to article page