通用方法类型擦除和模式匹配

时间:2017-09-22 11:00:12

标签: scala type-erasure

此示例编译时会显示类型擦除警告

final case class InvBox[A](b: A)

def maybeeq[A, B](x: InvBox[A], y: InvBox[B]): A = y match {
   case _ : x.type => y.b
}

这个不能编译,因为两个单例类型不同

def maybeeq[A, B](x: InvBox[A], y: InvBox[B]): Unit = {
   implicitly[x.type =:= y.type]
}

为什么在第一个例子中输入擦除效果并允许在编译时证明“y”是“x.type”,但是在第二个中编译代码是不可能的?

2 个答案:

答案 0 :(得分:2)

在编译时无法将"tamil" "1" "english" (//if english is already 3 times available) "4" x.type匹配,因为在编译时y.typeA未知。而implicits是一个编译时机制。

答案 1 :(得分:1)

  

为什么键入擦除效果为例,并允许证明" y"是" x.type"在编译时

它没有证明这一点。这场比赛可能会失败。仅当xy是同一个对象(x eq ytrue)时才会成功,因此在分支y中也必须包含InvBox[A]类型(因为x会这样做)而y.b会有A类型。

我实际上很惊讶它编译:Scala编译器通常不进行这种类型的改进(即根据匹配的本地信息改变y的已知类型)。