Scala 类型参数限定到最终类的模式匹配

Scala 类型参数限定到最终类的模式匹配,scala,type-erasure,Scala,Type Erasure,这里有一个例子 def maybeeq[A <: String](x: A):A = x match { case z:A => x } def maybeeq[A x } 它在编译过程中产生了以下错误消息 错误:(27,12)scrutinee与模式类型不兼容; 发现:A 必需:字符串 案例z:A=>x 我可以将任何最后一个类放入A的绑定中,以复制错误 为什么它为非final类编译,但在final类上失败?为什么类型擦除不只是用字符串替换 编辑: 注意:这样的绑定允许我将字

这里有一个例子

def maybeeq[A <: String](x: A):A = x match {
  case z:A => x
}
def maybeeq[A x
}
它在编译过程中产生了以下错误消息

错误:(27,12)scrutinee与模式类型不兼容; 发现:A 必需:字符串 案例z:A=>x

我可以将任何最后一个类放入A的绑定中,以复制错误

为什么它为非final类编译,但在final类上失败?为什么类型擦除不只是用字符串替换

编辑:


注意:这样的绑定允许我将字符串类型的值传递给“x”参数。因此“x”可以只是一个字符串,而不必是字符串的子类型,所以我不会要求编译器编译签名不正确的方法。在实际代码中,我只会将字符串放在参数上,但从实验的角度来看,我很感兴趣为什么这样的需要在现有限制之上设置tra限制(基于最终等级性质)。

最终等级无法扩展。因此对于
def-maybeeq[A最终等级无法扩展。
def-maybeeq[ATBH这是一个关于编译器设计的问题,只能由实现这种检查的人来回答

编译器测试套件中存在这样一种情况,它与类型信息被丢弃到无法将具体类型分配给变量的程度有关,但从该测试的
git-dull
中无法理解其原因



然而,我要指出的是,仍然有许多方法可以满足
aTBH这是一个关于编译器设计的问题,只有那些实现这种检查的人才能回答这个问题

编译器测试套件中存在这样一种情况,它与类型信息被丢弃到无法将具体类型分配给变量的程度有关,但从该测试的
git-dull
中无法理解其原因



然而,我要指出的是,仍然有很多方法可以满足
a,但是x参数可以只是一个字符串,这通过了绑定检查。我不明白为什么编译器需要限制这种情况。@chengpohi实际上“
a
只能是
String
类型”不是真的:
typet@chengpohi而且
maybeeq[String with Int](???);maybeeq[String with Cloneable](???)
…@BogdanVakulenko我不是要争辩,我只是注意到不准确。我们不要混淆类和类型(在Scala中)。如果实例的存在很重要,我们可以做
maybeeq[Null](Null)
@BogdanVakulenko顺便说一句,我们也忘记了文字类型:
maybeeq[“a”](“a”)
在typelevelscala中,或者
maybeeq[Witness.`a”`T](“a”)
在shapess中,或者
val a=“a”;maybeeq[a.type](a)
在Lightbend Scala(标准Scala)中但是x参数可以只是一个字符串,这通过了绑定检查。我不明白为什么编译器需要限制这种情况。@chengpohi实际上“
a
只能是
String
type”不是真的:
type t@chengpohi而且
maybeeq[String with Int](?);maybeeq[String with Cloneable](?)
…@BogdanVakulenko我不是要争辩,我只是注意到了不准确。我们不要混淆类和类型(在Scala中)。如果实例的存在很重要,我们可以做
maybeeq[Null](Null)
@BogdanVakulenko顺便说一句,我们也忘记了文字类型:
maybeeq[“a”(“a”)
在类型级Scala中或
maybeeq[Witness.`a`.t](“a”)
在无形状中或
val a=“a”maybeeq[a.type](a)
在Lightbend Scala(标准Scala)中.btw,您提到的测试似乎与存在类型在没有类型成员存在的情况下无法扩展到本地上下文的问题有关,因此无法用于模式匹配。我不是100%确定,但如果您感兴趣,您可以在这里找到一些解释。顺便说一句,您提到的测试似乎与以下问题有关:在没有类型成员存在的情况下,存在类型不能扩展到本地上下文,因此不能用于模式匹配。我不是100%确定,但如果您感兴趣,可以在这里找到一些解释
val UhOh: { type T <: String } = new { type T = String }
implicitly[UhOh.T <:< String] // satisfies type bound
implicitly[UhOh.T =:= String] // won't compile - compiler cannot prove the type equality