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

Generic method type erasure and pattern matching

此示例编译时出现类型擦除警告

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",但在第二个示例中无法编译代码?

不可能在编译时匹配x.typey.type,因为在编译时AB是未知的。而implicits是一种编译时机制。

Why type erasure effects first example and allowed to prove that "y" is "x.type" on compile time

这并不能证明这一点。这场比赛可能会失败。只有当 xy 是同一个对象(x eq ytrue)时它才会成功,所以在分支 y 中也必须有类型 InvBox[A](因为 x 有)和 y.b 将具有类型 A.

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