通用方法类型擦除和模式匹配
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.type
和y.type
,因为在编译时A
和B
是未知的。而implicits是一种编译时机制。
Why type erasure effects first example and allowed to prove that "y" is "x.type" on compile time
这并不能证明这一点。这场比赛可能会失败。只有当 x
和 y
是同一个对象(x eq y
是 true
)时它才会成功,所以在分支 y
中也必须有类型 InvBox[A]
(因为 x
有)和 y.b
将具有类型 A
.
我真的很惊讶它的编译:Scala 编译器通常不会进行这种类型细化(即根据匹配的本地信息更改 y
的已知类型)。
此示例编译时出现类型擦除警告
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.type
和y.type
,因为在编译时A
和B
是未知的。而implicits是一种编译时机制。
Why type erasure effects first example and allowed to prove that "y" is "x.type" on compile time
这并不能证明这一点。这场比赛可能会失败。只有当 x
和 y
是同一个对象(x eq y
是 true
)时它才会成功,所以在分支 y
中也必须有类型 InvBox[A]
(因为 x
有)和 y.b
将具有类型 A
.
我真的很惊讶它的编译:Scala 编译器通常不会进行这种类型细化(即根据匹配的本地信息更改 y
的已知类型)。