edit: ответ Луиса, включающий использование одного типа параметра и опору на вывод типа, вероятно, является наилучшим общим решением. Если вы используете два отдельных типа, вот несколько вариантов:
Поскольку вы пытаетесь сравнить два отдельных класса, вы не можете напрямую наследовать реализацию члена-признака, которая будет соответствовать обоим. Однако, если вы можете предоставить функциональные литералы, которые преобразуют класс в Double, вы можете использовать следующий код.
def compare[T,U](a: T, op:String, b: U, tToDouble: T => Double, uToDouble: U => Double): Boolean = {
op match {
case "==" => tToDouble(a) == uToDouble(b)
case "<" => tToDouble(a) < uToDouble(b)
// and so on with other comparators...
}
}
//example using Int
println(compare(1, "<", 2, (x:Int) => x.toDouble, (y:Int) => y.toDouble)) //true
К сожалению, мы не можем использовать Упорядочивание или Числовое, потому что это параметризованные черты и ожидание для сравнения с самим собой. Другой метод - просто принять функцию компаратора, которая принимает объекты каждого типа всякий раз, когда вы хотите сравнить два типа объектов.
def compare[T,U](a: T, op:String, b: U, comparator: (T,U) => Int): Boolean = {
op match {
case "==" => comparator(a,b) == 0
case "<" => comparator(a,b) < 0
// and so on with other comparators...
}
}
println(compare[Int, Int](1, "<", 2, (a,b) => a-b)) //true