为什么这个代码不类型检查?
def foo: Either[String, List[Int]] = {
val x = null: Either[String, String]
x match {
case l @ Left(_) => l
case Right(_) => Right(List(3))
}
}
具体而言,为什么不能/不编译器具体化左[A,X]和任一的类型[A,B]?
这是发生在2.8.2阶和Scala 2.9.2
为什么这个代码不类型检查?
def foo: Either[String, List[Int]] = {
val x = null: Either[String, String]
x match {
case l @ Left(_) => l
case Right(_) => Right(List(3))
}
}
具体而言,为什么不能/不编译器具体化左[A,X]和任一的类型[A,B]?
这是发生在2.8.2阶和Scala 2.9.2
这里有一个真正的冲突:
Left[String, String] <: Either[String, List[Int]]
是不正确的。 Left
打在左,右参数 ,即使之间不存在实际相差两(所以铸造将是安全的),这是不是你告诉编译器 。 所以,当然,它会抱怨。
有在模式匹配的类型推断等弱点,但是这是不是其中之一。
编辑:可以想见的替代单独使用参数化的实施Left
其中
Left[String] <: Either[String, Nothing] <: Either[String, List[Int]]
这将扔掉类型信息。 类似的方法swap
将小技巧就使用,但它会允许由OP给出的格局。 然而,在斯卡拉标准实施中使用的类型保持形态。