Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 我可以使用case对象作为方法参数吗_Scala_Case_Visitor - Fatal编程技术网

Scala 我可以使用case对象作为方法参数吗

Scala 我可以使用case对象作为方法参数吗,scala,case,visitor,Scala,Case,Visitor,我希望在不使用match的情况下以不同的方式处理每个结果 我想实现多个方法,但它只适用于类,而使用case类则太麻烦了 以下方法不起作用: sealed trait Result object Result { final case object Result1 extends Result final case object Result2 extends Result final case object Result3 extends Result } def doSth(r

我希望在不使用
match
的情况下以不同的方式处理每个结果

我想实现多个方法,但它只适用于类,而使用case类则太麻烦了

以下方法不起作用:

sealed trait Result

object Result {
  final case object Result1 extends Result
  final case object Result2 extends Result
  final case object Result3 extends Result
}

def doSth(result: Result)=
  consumeResult(result)

private def consumeResult(result: Result.Result1) = ???

private def consumeResult(result: Result.Result2) = ???

private def consumeResult(result: Result.Result3) = ???

立即解决的办法是像这样使用对象
类型

private def consumeResult(result: Result.Result1.type) = ???
etc..
但是,更广泛的代码是行不通的:

def doSth(result: Result) =
  consumeResult(result)
函数重载发生在编译时,而不是运行时。调用
ConsumerResult
时,运行时类型将丢失。编译时类型是
Result
,因此它与任何重载版本的
consumerresult
都不匹配

类型类可能是最好的方法:

trait Consume[T <: Result] {
  def consume()
}

object Consume {
  implicit object consume1 extends Consume[Result.Result1.type] {
    def consume() = {
      println("Consume1")
    }
  }

  implicit object consume2 extends Consume[Result.Result2.type] {
    def consume() = {
      println("Consume2")
    }
  }
}

def doSth[T <: Result](result: T)(implicit ev: Consume[T]) =
  ev.consume()


doSth(Result.Result1) // Prints "Consume1"
doSth(Result.Result2) // Prints "Consume2"
doSth(Result.Result3) // Does not compile, no matching typeclass

trait-Consume[T
result:result.Result1.type
-然而,通常模式匹配或类型类在这些情况下更为常见。
def-doSth[T@AlexeyRomanov,即使您修复了它,类型解析也是在编译时完成的,因此它不起作用:(没错,上面的实现无法完成任务。我想知道,有没有其他方法解决这个问题,或者转课是不可避免的?@syforce(编辑)的答案以什么方式不是“完成任务”您的实现对于作为方法参数传递的每个特定结果子类型都是正确的。但是请考虑:<代码> VAL结果:结果=RESULT.RESULT1 DOST(结果)//将不会编译,因为没有隐式结果类型< /代码>。