La digitazione implicita è che Left("aoeu")
è un Left[String,Nothing]
. È necessario digitarlo esplicitamente.
(Left("aoeu"): Either[String,String]) match{case Right(x) => ; case Left(x) => }
Sembra che i modelli che corrispondono ai candidati debbano sempre essere di un tipo corrispondente al valore corrispondente.
scala> case class X(a: String)
defined class X
scala> case class Y(a: String)
defined class Y
scala> X("hi") match {
| case Y("hi") => ;
| case X("hi") => ;
| }
<console>:11: error: constructor cannot be instantiated to expected type;
found : Y
required: X
case Y("hi") => ;
^
Perché si comporta in questo modo? Sospetto che non ci siano buoni motivi per tentare di abbinare su un tipo incompatibile. Il tentativo di farlo è un segnale che lo sviluppatore non sta scrivendo ciò che realmente intendono. L'errore del compilatore aiuta a prevenire i bug.
Uhm, il compilatore ti sta dicendo che parte del tuo codice non è raggiungibile. Questa è una buona cosa, sì? –