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
也必须有type
InvBox[A]
(因为
x
有)并且
y.b
将有type
A

实际上,我对它的编译感到惊讶:Scala编译器通常不会进行这种类型的细化(即根据匹配的本地信息更改
y
的已知类型)

为什么类型擦除会影响第一个示例并允许在编译时证明“y”是“x.type”

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


实际上,我对它的编译感到惊讶:Scala编译器通常不会进行这种类型的细化(即根据匹配它的本地信息更改已知类型的
y

但是编译器如何接受y.b是一个?我认为这应该发生在类型擦除之前。此外,
x.type
不是
InvBox[A]
,而是
x
的单态类型,只有
x
有。@Jean Philippellet为什么?我检查了一下,它证明了你是对的(),但为什么会这样呢?这是语言作者的设计决定。但编译器如何接受y.b是一个?我认为这应该发生在类型擦除之前。此外,
x.type
不是
InvBox[A]
,而是
x
的单态类型,只有
x
有。@Jean Philippellet为什么?我检查了一下,结果证明你是对的(),但为什么呢?这是语言作者的设计决定。