问题描述
我想不使用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