Просто чтобы вы знали, что это компилируется и работает, как и ожидалось.
object operation {
trait Operator[T, U] {
def addition(l: T, r: U): U
}
object Operator {
implicit final val IntFloatOperator: Operator[Int, Float] =
new Operator[Int, Float] {
override def addition(l: Int, r: Float): Float = l + r
}
}
def addition[T, U](l: T, r: U)(implicit op: Operator[T, U]): U = op.addition(l, r)
}
def fn(a: Int, b: Float): Float = operation.addition(a, b)
fn(1, 10.0f) // 11.0F
Редактировать
Обращаясь к комментарию, вы можете либо:
1) Предоставитьтребуемый неявный.
def fn[T1 <: Int, T2 <: Float](a: T1, b: T2)(implicit op: Operator[T1, U1]): U1 =
op.addition(a, b)
(Примечание: пользователь метода отвечает за наличие в области действия неявного типа Оператор [T1, U1] для типовон / она использует.)
2) Явный вызов IntFloatOperator .
def fn [T1 <: Int, T2 <: Float] (a: T1, b: T2): T2 = неявно [Оператор [Int, Float]]. Сложение (a, b) </p>
(Примечание: для предоставления пользовательского призывателя принято сокращатьшаблон.)
object Operator {
// Summoner.
def apply[T, U](implicit op: Operator[T, U]): Operator[T, U] = op
...
}
def fn[T1 <: Int, T2 <: Float](a: T1, b: T2): T2 =
Operator[Int, Float].addition(a, b)