Scala不适用于通用参数

时间:2018-07-12 21:43:30

标签: scala generics pattern-matching case-class

因此,我想确保大小写匹配中的提取器将在可能的情况下为别名提供正确的泛型类型。

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吗?

1 个答案:

答案 0 :(得分:2)

您可以尝试将类型参数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
}