Ho una gerarchia di caso di classe per codificare alcuni di richiesta e di elaborazione errori:Scala pattern match non è esaustivo su classi case annidate
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
Se scrivo un semplice incontro in tutti i modelli:
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
}
il compilatore mi dà un avvertimento circa partita mancante:
match may not be exhaustive.
It would fail on the following input: ProcessingError(_)
def printMatches(error: OpError): Unit = error match {
Ma ProcessingError prende in un P rocessingErrorType con solo due estensioni: InvalidFormat e EntityNotFound, entrambe le quali sono contabilizzate nella corrispondenza del modello. Cosa mi manca?
Ancora più curioso è che se cambio il tipo di parametro di InvalidParameters o InvalidEndpoint ad una stringa *, non ottengo l'errore:
final case class InvalidParameters(reason: String*) extends RequestErrorType
Tutte le idee?
'printMatches (ProcessingError (new ProcessingErrorType {}))' non corrisponde ad alcun –
questo esempio vìola il contratto 'sealed'. – pedrofurla
In termini di comportamento curioso con il parametro String *, sembra che Scala giri di controllo esaustivo quando una classe case ha un parametro varargs: https://issues.scala-lang.org/browse/SI-8178?jql = etichette% 20% 3D% 20exhaustiveness – ssanj