我可以使用案例对象作为方法参数

问题描述

我想不使用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) = ???

解决方法

直接的解决方法是像这样使用对象type

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

但是,更广泛的代码无法正常工作

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

函数重载发生在编译时,而不是运行时。在您致电consumeResult时,运行时类型已丢失。编译时类型为Result,因此它与consumeResult的任何重载版本都不匹配。

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

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