【发布时间】:2015-12-22 13:16:15
【问题描述】:
我有一个案例类层次结构来编码一些请求和处理错误:
sealed trait OpError
sealed trait RequestErrorType
sealed trait ProcessingErrorType
final case class InvalidEndpoint(reason: String) extends RequestErrorType
final case class InvalidParameters(reason: String) extends RequestErrorType
final case class InvalidFormat(response: String) extends ProcessingErrorType
final case class EntityNotFound(id: Long) extends ProcessingErrorType
final case class RequestError(errorType: RequestErrorType) extends OpError
final case class ProcessingError(errorType: ProcessingErrorType) extends OpError
如果我写一个跨越所有模式的简单匹配:
def printMatches(error: OpError): Unit = error match {
case RequestError(InvalidEndpoint(reason)) => //print something
case RequestError(InvalidParameters(reason)) => //print something
case ProcessingError(InvalidFormat(format)) => //print something
case ProcessingError(EntityNotFound(entityId)) => //print something
}
编译器给我一个关于缺少匹配的警告:
match may not be exhaustive.
It would fail on the following input: ProcessingError(_)
def printMatches(error: OpError): Unit = error match {
但是 ProcessingError 接受一个只有两个扩展的 ProcessingErrorType:InvalidFormat 和 EntityNotFound,这两者都在模式匹配中被考虑在内。我错过了什么?
更奇怪的是,如果我将 InvalidParameters 或 InvalidEndpoint 的参数类型更改为 String*,我不会得到错误:
final case class InvalidParameters(reason: String*) extends RequestErrorType
有什么想法吗?
【问题讨论】:
-
printMatches(ProcessingError(new ProcessingErrorType{}))不匹配 -
这个例子违反了
sealed合约。 -
就 String* 参数的奇怪行为而言,当案例类具有可变参数参数时,听起来 Scala 会转向详尽检查:issues.scala-lang.org/browse/…