问题描述
我想执行将某些对象作为参数的方法。我可以传递许多不同的对象。那里的对象有不同的类型(各种类的实例),但是它们都有共同的方法(方法A,方法B)。因此,我在定义类型时遇到问题,这是我目前作为示例所做的事情。任何人都可以帮助修复它?
sealed trait Foo
final case class A(a: SomeClass1Type) extends Foo
final case class B(b: SomeClass2Type) extends Foo
object SomeObject {
implicit val executionContext: ExecutionContext = ExecutionContext.Implicits.global
val caseMatcher = new SomeClass1
// val caseMatcher = new SomeClass2
execute(caseMatcher)
def execute(caseMatcher: Either[SomeClass1Type,SomeClass2Type]) = {
caseMatcher match {
case a: A(SomeClass1) => executeCase1(new SomeClass1)
case b: B(SomeClass2) => executeCase2(new SomeClass2)
}
}
def executeCase1(param: SomeClass1Type) {
val a = param.methodA
val b = param.methodB
}
def executeCase2(caseMatcher: SomeClass2Type) {
val a = param.methodA
val b = param.methodB
}
}
解决方法
似乎您需要structural-types:
def main(args: Array[String]): Unit = {
val c1 = SomeClass1(1)
val c2 = SomeClass1(2)
val result1 = process(c1) // 5
val result2 = process(c2) // 8
}
def process[T <: {def multiply: Int; def sum: Int} ](t: T): Int = t.multiply + t.sum
case class SomeClass1(int: Int) {
def multiply: Int = int * 2
def sum: Int = int + 2
}
case class SomeClass2(int: Int) {
def multiply: Int = int * 3
def sum: Int = int + 3
}
但是请注意,如果将其用于经常调用的代码段中,可能会导致性能严重下降。