Я не совсем уверен, что это то, чего вы хотите, но я надеюсь, что это поможет.
По сути, вам необходимо переслать доказательство того, что тип T
является Числовым , во внешний метод. Но вы также должны разобраться со случаем, когда это не так.
Для этого случая вы можете указать значение по умолчанию для неявного параметра, например:
class A[T](val a: T) {
def doSomething(b: T)(implicit ev: Numeric[T] = null): T = Option(ev) match {
case Some(ev) => doSomethingWithNumeric(b)(ev)
case None => b
}
def doSomethingWithNumeric(b: T)(implicit ev: Numeric[T]): T =
ev.plus(a, b)
}
Кажется, работает.
(new A(10)).doSomething(100) // res: Int = 110
(new A("hey")).doSomething("world") // res: String = "world"
Обратите внимание, что если у вас будет много методов, возможно, самым чистым решением было бы сделать A
a trait с двумя реализациями, одна для числовых типов, а другая - без числовых типов.
Сделайте конструкторы обоих подклассов закрытыми и создайте factory для A
в сопутствующем объекте, который запрашивает неявный числовой параметр, и, если он найден, он возвращает новый экземпляр числового подкласса.