Sie könnten die Type Class Pattern verwenden. Ich würde eine implizite MyClassOperators[T]
in Geltungsbereich benötigen, und implementieren Sie es nur für die gewünschten Int
, und Double
.
das Merkmal definieren die Durchführung der Operationen:
lässt
object MyClassImplicits {
trait MyClassOperators[T <: AnyVal] {
def +(firstOperand: T, secondOperand: T): MyClass[T]
def -(firstOperand: T, secondOperand: T): MyClass[T]
def *(firstOperand: T, secondOperand: T): MyClass[T]
def /(firstOperand: T, secondOperand: T): MyClass[T]
}
nun eine konkrete Umsetzung für Int
bieten:
implicit object MyClassIntOperators extends MyClassOperators[Int] {
override def +(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand + secondOperand)
override def -(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand - secondOperand)
override def *(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand * secondOperand)
override def /(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand/secondOperand)
}
und die Definition von MyClass
ändern, um die impliziten MyClassOperators[T]
zu sein in ihrem Umfang zu verlangen:
class MyClass[T <: AnyVal : MyClassOperators](val value: T) {
def doSomeAddition(otherValue: T): MyClass[T] = {
implicitly[MyClassOperators[T]].+(value, otherValue)
}
}
Wenn wir laufen diese mit einem Int
Beispiel:
def main(args: Array[String]): Unit = {
val myClassOfInt = new MyClass[Int](1)
println(myClassOfInt.doSomeAddition(2).value)
}
Ausbeuten:
3
Aber wenn wir versuchen, dies mit einer Double
Instanz (die noch nicht implementiert):
[error] could not find implicit value for evidence parameter of type tests.NewTest.MyClassImplicits.MyClassOperators[Double]
[error] val myClassOfInt = new MyClass[Double](1.0)
[error] ^
[error] one error found
Vielen Dank. Dies scheint eine sehr gute Lösung zu sein. Ich werde es versuchen und überprüfen und diese Antwort akzeptieren. –
Es funktioniert wie vorgesehen. Danke noch einmal. –