这段代码有什么问题?
(Left("aoeu")) match{case Right(x) => ; case Left(x) => }
<console>:6: error: constructor cannot be instantiated to expected type;
found : Right[A,B]
required: Left[java.lang.String,Nothing]
为什么模式匹配器没有跳过Right并检查Left?
答案 0 :(得分:12)
隐式输入推断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") => ;
^
为什么它会像这样?我怀疑没有充分的理由尝试匹配不兼容的类型。试图这样做表明开发人员没有写出他们真正想要的东西。编译器错误有助于防止错误。
答案 1 :(得分:4)
scala> val left: Either[String, String] = Left("foo")
left: Either[String,String] = Left(foo)
scala> left match {
| case Right(x) => "right " + x
| case Left(x) => "left " + x }
res3: java.lang.String = left foo