【问题标题】:scala pattern matching on object type and method accepting argument of many types [closed]对象类型和方法的scala模式匹配接受多种类型的参数[关闭]
【发布时间】:2021-02-05 18:58:14
【问题描述】:

我想执行接受某个对象作为参数的方法。我可以通过许多不同的对象。对象有不同的类型(各种类的实例),但它们都有共同的方法(methodA、methodB)。所以,我在定义类型时遇到了问题,这就是我目前所做的一个例子。谁能帮忙解决一下?

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
  }
}

【问题讨论】:

  • Either 不是联合类型 - 您需要匹配左或右。此外,方法重载在这里更容易实现。
  • 我知道我不能使用 Either 但我在这里使用 Either 来显示我可以输入两种类型中的任何一种但我不知道如何解决它所以执行方法可以接受这两种类型中的任何一种我不知道应该在执行方法中为 caseMAtcher 参数设置什么类型以接受这两种类型中的任何一种,并且仍然能够访问 executeCase 中对象上的方法
  • @user 我需要匹配 Left[Type1, Type2] 或 Right[Type1, Type2] 但是执行方法中 caseMatcher 的类型应该是什么,因为显然我的 IDE 会抱怨。
  • 你想实现Polymorphism希望链接有帮助。

标签: scala design-patterns types matching


【解决方案1】:

看来你需要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
  }

但请注意,如果将其用于经常调用的代码段中,可能会大大降低性能。

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2012-09-23
    • 2012-03-25
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2014-07-01
    • 2016-01-29
    相关资源
    最近更新 更多