为什么能阶不能推断左[X,A]是要么合理亚型[X,B]?(Why can scala not Inf

2019-09-20 23:30发布

为什么这个代码不类型检查?

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

Answer 1:

这里有一个真正的冲突:

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

是不正确的。 Left打在左,右参数 ,即使之间不存在实际相差两(所以铸造将是安全的),这是不是你告诉编译器 。 所以,当然,它会抱怨。

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


编辑:可以想见的替代单独使用参数化的实施Left其中

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

这将扔掉类型信息。 类似的方法swap将小技巧就使用,但它会允许由OP给出的格局。 然而,在斯卡拉标准实施中使用的类型保持形态。



文章来源: Why can scala not Infer that Left[X,A] is a reasonable subtype of Either[X,B]?