Неявная типизация заключается в том, что Left("aoeu")
является Left[String,Nothing]
. Вам нужно явно ввести его.
(Left("aoeu"): Either[String,String]) match{case Right(x) => ; case Left(x) => }
Кажется, что кандидаты на соответствие шаблону должны всегда иметь тип, соответствующий совпадающему значению.
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") => ;
^
Почему он ведет себя так? Я подозреваю, что нет веских оснований пытаться сопоставить несовместимый тип. Попытка сделать это - признак того, что разработчик не пишет то, что они на самом деле намерены. Ошибка компилятора помогает предотвратить ошибки.
Ум, компилятор сообщает вам, что часть вашего кода недостижима. Это хорошо, да? –