此示例编译时会显示类型擦除警告
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”,但是在第二个中编译代码是不可能的?
答案 0 :(得分:2)
在编译时无法将"tamil"
"1"
"english" (//if english is already 3 times available)
"4"
与x.type
匹配,因为在编译时y.type
和A
未知。而implicits是一个编译时机制。
答案 1 :(得分:1)
为什么键入擦除效果为例,并允许证明" y"是" x.type"在编译时
它没有证明这一点。这场比赛可能会失败。仅当x
和y
是同一个对象(x eq y
为true
)时才会成功,因此在分支y
中也必须包含InvBox[A]
类型(因为x
会这样做)而y.b
会有A
类型。
我实际上很惊讶它编译:Scala编译器通常不进行这种类型的改进(即根据匹配的本地信息改变y
的已知类型)。