Scala 类型擦除和模式匹配的通用方法
此示例编译时带有类型擦除警告Scala 类型擦除和模式匹配的通用方法,scala,type-erasure,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.typ
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
是未知的。隐式是一种编译时机制 不可能在编译时将x.type
与y.type
匹配,因为在编译时A
和B
是未知的。隐式是一种编译时机制
为什么类型擦除会影响第一个示例并允许在编译时证明“y”是“x.type”
这并不能证明这一点。这场比赛可能会失败。只有当x
和y
是同一个对象(x eq y
是true
)时,它才会成功,因此在分支中y
也必须有typeInvBox[A]
(因为x
有)并且y.b
将有typeA
实际上,我对它的编译感到惊讶:Scala编译器通常不会进行这种类型的细化(即根据匹配的本地信息更改y
的已知类型)
为什么类型擦除会影响第一个示例并允许在编译时证明“y”是“x.type”
这并不能证明这一点。这场比赛可能会失败。只有当x
和y
是同一个对象(x eq y
是true
)时,它才会成功,因此在分支中y
也必须有typeInvBox[A]
(因为x
有)并且y.b
将有typeA
实际上,我对它的编译感到惊讶:Scala编译器通常不会进行这种类型的细化(即根据匹配它的本地信息更改已知类型的
y
)但是编译器如何接受y.b是一个?我认为这应该发生在类型擦除之前。此外,x.type
不是InvBox[A]
,而是x
的单态类型,只有x
有。@Jean Philippellet为什么?我检查了一下,它证明了你是对的(),但为什么会这样呢?这是语言作者的设计决定。但编译器如何接受y.b是一个?我认为这应该发生在类型擦除之前。此外,x.type
不是InvBox[A]
,而是x
的单态类型,只有x
有。@Jean Philippellet为什么?我检查了一下,结果证明你是对的(),但为什么呢?这是语言作者的设计决定。