对象类型和接受多种类型参数的方法的scala模式匹配

问题描述

我想执行将某些对象作为参数的方法。我可以传递许多不同的对象。那里的对象有不同的类型(各种类的实例),但是它们都有共同的方法方法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
  }

但是请注意,如果将其用于经常调用的代码段中,可能会导致性能严重下降。