Вы можете решить вашу проблему, превратив NiceProperties[T]
в класс, который знает, как добавить, суммировать, ... два значения типа T
:
trait NiceProperties[T] {
def subtract(a: T, b: T): Double
def add(a: T, d: Double): T
}
Теперь вы можете создатьнеявный NiceProperties
объект или val для меток времени, дат, ...
object BetterTimestamp extends NiceProperties[Timestamp] {
def subtract(a: Timestamp, b: Timestamp): Double = ???
def add(a: Timestamp, d: Double): Timestamp = ???
}
В вашем примере метода вы запросите неявный NiceProperties[T]
, который выполняет операции для вашего.
def myUtil[T](t: T)(implicit prop: NiceProperties[T]): T = {
prop.add(prop.add(t, 1.0), 1.0)
}
Поскольку это ужасно, вы можете использовать неявный класс для добавления операторов +
, -
, ... в любой класс, где доступен неявный NiceProperties[T]
:
implicit class NicePropertiesOps[T](t: T)(implicit prop: NiceProperties[T]) {
def +(d: Double): T = prop.add(t, d)
def -(b: T): Double = prop.subtract(t, b)
}
Теперь ваш пример сверху должен работать почти так, как вы описали.
def myUtil[T : NiceProperties](t: T): T = {
(t + 1.0) + 1.0
}
https://scastie.scala -lang.org / 0D1Y9sE5S5mrzm9coZPMWw