4

为什么此代码不进行类型检查?

def foo: Either[String, List[Int]] = {  
  val x = null: Either[String, String]

  x match {
    case l @ Left(_) => l
    case Right(_) => Right(List(3))
  }
}

具体来说,为什么编译器不能/不具体化 Left[A,X] 和 Either[A,B] 的类型?

这发生在 scala 2.8.2 和 scala 2.9.2

4

1 回答 1

9

这里有一个真正的冲突:

Left[String, String] <: Either[String, List[Int]]

不是真的。 是在左右参数Left上键入的,即使两者之间没有实际区别(因此强制转换是安全的),这不是您告诉编译器的内容。所以,当然,它会抱怨。

模式匹配中的类型推断还有其他弱点,但这不是其中之一。


编辑:可以想象一种替代的单参数化实现,Left其中

Left[String] <: Either[String, Nothing] <: Either[String, List[Int]]

这会丢弃类型信息。像这样的方法swap使用起来会更棘手,但它会允许 OP 给出的模式。但是,在 Scala 的标准实现中使用了类型保留形式。

于 2012-08-07T15:08:51.170 回答