如果类型变量是小写的,那么它只能在匹配中引入?

Ale*_*nov 5 generics scala

在尝试理解某些代码时,我遇到了奇怪的行为,并将其简化为:

在匹配中引入类型参数不起作用:

scala> Some(0) match { case _: Some[A] => 0 }
<console>:8: error: not found: type A
              Some(0) match { case _: Some[A] => 0 }
                                           ^
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其设为小写,它会:

scala> Some(0) match { case _: Some[a] => 0 }
res2: Int = 0
Run Code Online (Sandbox Code Playgroud)

这是Scala中的错误还是我错过了解释?

Tra*_*own 6

你可以在模式中看到与值变量相同的东西:

scala> Some(0) match { case A => 0 }
<console>:8: error: not found: value A
              Some(0) match { case A => 0 }
                                   ^

scala> Some(0) match { case a => 0 }
res1: Int = 0
Run Code Online (Sandbox Code Playgroud)

如果要在模式中引入变量(在值或类型级别),则必须使用小写标识符 - 根本无法引入大写变量.请注意,可以向另一个方向移动 - 如果要匹配小写变量的值,可以用后引号将其包围.

语言规范(讨论2.3中引入的更改):

模式中类型的语法已经过细化(第8.2节).Scala现在区分类型变量(以小写字母开头)和类型作为模式中的类型参数.类型变量绑定在模式中.与先前版本一样,其他类型参数已被删除.

所以不,不是一个错误,虽然它可以说是一个非常令人困惑的语言设计决定.