Scala不适用于泛型参数



因此,如果可能的话,我想确保案例匹配中的提取器会为其提供正确的泛型类型的别名。

trait MyT[A]
case class MyC[A](t: MyT[A])
def foo: MyC[_]
def go[A](t: MyT[A]): Option[MyC[A]] = foo match {
case m@MyC(`t`) => Some(m.copy(t = t))
case _ => None
}

这是有效的,但我宁愿不做m.copy(t = t)。基本上m@将绑定到MyC[Any],但我希望它绑定到MyC[A]。这可能吗,也许有一个自定义的unapply

您可以尝试将类型参数A显式地归因于模式匹配的MyC,并通过@unchecked:消除警告

trait MyT[A]
case class MyC[A](t: MyT[A])
def foo: MyC[_] = ???
def go[A](t: MyT[A]): Option[MyC[A]] = foo match {
case m: MyC[A @unchecked] if (m.t == t) => Some(m)
case _ => None
}

最新更新