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

时间:2014-02-03 11:00:13

标签: scala generics

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

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

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

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

scala> Some(0) match { case _: Some[a] => 0 }
res2: Int = 0

这是Scala中的错误还是我缺少解释?

1 个答案:

答案 0 :(得分: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

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

来自the language specification(讨论2.3中引入的更改):

  

模式中类型的语法已经过改进(第8.2节)。斯卡拉现在   区分类型变量(以小写字母开头)   字母)和类型作为模式中的类型参数。类型变量是   绑定在模式中。其他类型的参数与之前一样   版本,已删除。

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