A clarification
Duck-wrapping is not exactly function or method overloading. Consider the type T<Any> ∪ Any
. Any
is any type in the program and T
is some wrapper type (here parameterised over Any
) and together they form a type union. The problem arises because T<Any>
is part of the set of types Any
. Therefore T<T<Any>>
is also valid for either side of the union.
Contrast this with T<Number> ∪ Number
. There is no ambiguity in this type. Likewise String ∪ Element
is not ambiguous (and doesn't wrap either). These could both be implemented with method overloading but would not be duck-wrapping.