Ваша проблема может быть воспроизведена с помощью:
class C[T: Numeric] {def add(a: T, b: T) = a+b }
error: type mismatch;
found : T
required: String
Что там происходит: в scala, как и в java, вы можете делать String + что угодно, а также что угодно + String. Так как, в отличие от java, pperators - это просто обычные вызовы методов, это означает, что для каждого типа существует соответствующий метод +. Конечно, это не так, поскольку у типов Java такого метода нет. У нас есть implicit def any2StringAdd(x: Any)
в Predef
, что делает это +
доступным путем неявного преобразования. В вашем коде это единственный доступный +, поэтому он жалуется, что B.Value
не String
.
Теперь, почему предполагаемый +
недоступен? T:Numeric
требует, чтобы в неявной области видимости было значение Numeric[T]
. В нем ничего не говорится о том, какой тип T должен быть, и какие методы доступны в T
. Этот экземпляр Numeric[T]
имеет метод def plus(x: T, y: T): T
. Само по себе это не делает +
доступным на T. Вы можете позвонить плюс напрямую, но это не удобно. К счастью, +
делегирование plus
может быть добавлено неявным преобразованием (точно так же, как +(String)
было в Predef
), при условии, что вы добавили некоторые импликации в область действия:
import Numeric.Implicits._