I thinks it’s easier to explain it with a simple example. (help rephrasing the title is welcome 😉
I’d like to implement a squared method and, using implicit def, automatically add it to any class that supports the *-operator.
With an Int it’s very easy:
class EnhancedInt(x: Int) { def squared = x * x }
implicit def IntToEnchancedInt(x: Int) = new EnhancedInt(x)
But with Any or AnyVal I get the following error:
scala> class EnhanceAny(x: AnyVal) { def squared = x * x }
<console>:7: error: value * is not a member of AnyVal
class EnhanceAny(x: AnyVal) { def squared = x * x }
I’d like to know how I could apply it to any numeric class, or, even better, to any class supporting the *-operator.
It’s not possible to have solution that works on any type with a
*method without writing a boilerplate conversion for each type you want to deal with. Essentially to do that you would need a recursive structural type, and Scala does not support those because of JVM type erasure. See this post for more details.You can get fairly close to what you want using a type class along with the
Numerictype class, (inspired by the answers to this and this question). This will work with most primitives: