根据 scala 规范,案例类构建的提取器如下(scala 规范§5.3.2):
def unapply[tps](x: c[tps]) =
if (x eq null) scala.None
else scala.Some(x.xs11, ..., x.xs1k)
出于实现原因,我希望能够在非案例类上模仿此提取器的行为。但是,我的实现无法重现相同的行为。
这是我有差异的一个例子:
trait A
sealed trait B[X <: A]{ val x: X }
case class C[X <: A](x: X) extends B[X]
class D[X <: A](val x: X) extends B[X]
object D {
def unapply[X <: A](d: D[X]): Option[X] =
if (d eq None) None
else Some(d.x)
}
def ext[X <: A](b: B[X]) = b match {
case C(x) => Some(x)
case D(x) => Some(x)
case _ => None
}
我有以下警告:
<console>:37: warning: non variable type-argument X in type pattern D[X] is unchecked since it is eliminated by erasure
case D(x) => Some(x)
请注意,警告仅在D
案例中出现,而不是在案例类 textractor 案例中。您对警告的原因/我应该做些什么来避免这个警告有任何想法吗?
注意:如果你想在 REPL 中测试它,最简单的方法是:
激活未经检查的警告
斯卡拉>:权力
scala> settings.unchecked.value = true
在粘贴模式下复制上面的代码:
斯卡拉>:粘贴
[复制粘贴]
[Ctrl + D]
编辑:正如安托拉斯所说,它应该是一个编译器错误,也许 scala 版本可能有用:scala 2.9.0.1(经过快速测试,scala 2.9.1RC2 中仍然存在)