ich einen Fall, Klassenhierarchie haben einige Anfrage und Verarbeitungsfehler zu codieren:Scala Mustererkennung ist auf verschachtelte Fall Klassen keinen Anspruch auf Vollständigkeit
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
Wenn ich ein einfaches Spiel für alle Muster schreiben:
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
}
die Compiler gibt mir eine Warnung über fehlendes Spiel:
match may not be exhaustive.
It would fail on the following input: ProcessingError(_)
def printMatches(error: OpError): Unit = error match {
Aber ProcessingError nimmt in einem P rocessingErrorType mit nur zwei Erweiterungen: InvalidFormat und EntityNotFound, die beide in der Musterübereinstimmung berücksichtigt werden. Was vermisse ich?
Noch neugierig ist, dass wenn ich den Parametertyp von InvalidParameters oder InvalidEndpoint in einen String * ändern, ich habe nicht den Fehler:
final case class InvalidParameters(reason: String*) extends RequestErrorType
Irgendwelche Ideen?
'printMatches (ProcessingError (new ProcessingErrorType {}))' es ist keine Übereinstimmung –
dieses Beispiel verstößt gegen den 'versiegelten' Vertrag. – pedrofurla
In Bezug auf das seltsame Verhalten mit dem String * -Parameter, es klingt wie Scala Umdrehungen der erschöpfenden Prüfung, wenn eine Fallklasse einen varargs Parameter hat: https://issues.scala-lang.org/browse/SI-8178?jql = labels% 20% 3D% 20exhaustivity – ssanj