scala - 我可以使用案例对象作为方法参数吗
问题描述
我想在不使用match
.
我想做多个方法实现,但它只适用于类,使用案例类会太成问题。
以下方法不起作用:
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
推荐阅读
- java - Java Swing 嵌套 JTable
- c#-4.0 - 转发或回复邮件时获取父邮件项以读取标题
- amazon-web-services - systemctl daemon-reload 失败,参数数量无效
- reactjs - 此路由不支持 POST 方法。支持的方法:GET、HEAD。在 laravel api资源中
- python-3.x - 在某个时间点计算数据框中的灾难
- r - R:用相应但已更改的变量名称替换 for 循环中的 NA
- r - qnorm 的数值问题
- php - Laravel 旧输入 8.x
- python - python 格式的 flake8 (E902) TokenError
- javascript - 如何影响不属于
?