Scala 类型变量只能在匹配中引入,如果它为';是小写吗?

Scala 类型变量只能在匹配中引入,如果它为';是小写吗?,scala,generics,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中的

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

在匹配中引入类型参数无效:

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

这是Scala中的一个bug,还是我缺少了一个解释?

您可以在模式中的值变量中看到同样的情况:

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
scala>Some(0)匹配{case A=>0}
:8:错误:未找到:值A
某些(0)匹配{case A=>0}
^
scala>Some(0)匹配{case a=>0}
res1:Int=0
如果要在模式中引入变量(在值或类型级别),则必须使用小写标识符—根本无法引入大写变量。请注意,如果要匹配小写变量的值,可以使用反引号将其括起来

来自(讨论2.3中引入的变更):

对模式中类型的语法进行了改进(§8.2)。斯卡拉现在 区分不同类型的变量(从小写开始) 字母)和类型作为模式中的类型参数。类型变量是 按图案装订。其他类型参数如下所示,如前所述 版本,删除


所以不,这不是一个bug,尽管这可能是一个相当令人困惑的语言设计决策。

一个问题。这项工作
type A=whatever;Some(0)匹配{case}:Some[A]=>0}
。但是如果我们用
Some[A]
替换
Some[A]
,它仍然有效,但是
A
在任何地方都没有定义。
a
在这里扮演什么角色?因为
a
是小写,它引入了一个变量,不需要在匹配之外定义它(事实上,如果在匹配之外有一个
a
,它将被隐藏)。我非常清楚这在值级别上是如何工作的,但出于某种原因,我没有意识到它也适用于类型级别。虽然@travis说的完全正确,但我认为在这种情况下,问题是不同的。编译器只是没有在当前范围内找到类型
A
某些[a]
起作用,因为在这种情况下,
a
被视为类型变量。因为在运行时它会被擦除,所以
a
Any
@Jatin:我就是这么说的!:)
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