【发布时间】:2012-02-06 13:19:46
【问题描述】:
是否可以执行结果符合外部方法的类型参数的模式匹配?例如。给定:
trait Key[A] {
def id: Int
def unapply(k: Key[_]): Boolean = k.id == id // used for Fail2
def apply(thunk: => A): A = thunk // used for Fail3
}
trait Ev[A] {
def pull[A1 <: A](key: Key[A1]): Option[A1]
}
trait Test extends Ev[AnyRef] {
val key1 = new Key[String] { def id = 1 }
val key2 = new Key[Symbol] { def id = 2 }
}
是否有Test(它的pull 方法)的实现,它在key 参数上使用模式匹配并为每个检查的键返回Option[A1],而不使用asInstanceOf?
一些可悲的尝试:
class Fails1 extends Test {
def pull[A1 <: AnyRef](key: Key[A1]): Option[A1] = key match {
case `key1` => Some("hallo")
case `key2` => Some('welt)
}
}
class Fails2 extends Test {
def pull[A1 <: AnyRef](key: Key[A1]): Option[A1] = key match {
case key1() => Some("hallo")
case key2() => Some('welt)
}
}
class Fails3 extends Test {
def pull[A1 <: AnyRef](key: Key[A1]): Option[A1] = key match {
case k @ key1() => Some(k("hallo"))
case k @ key2() => Some(k('welt))
}
}
显然没有任何作用......唯一的解决方案是强制转换:
class Ugly extends Test {
def pull[A1 <: AnyRef](key: Key[A1]): Option[A1] = key match {
case `key1` => Some("hallo".asInstanceOf[A1])
case `key2` => Some('welt .asInstanceOf[A1])
}
}
val u = new Ugly
u.pull(u.key1)
u.pull(u.key2)
【问题讨论】:
-
也许有一些高级的
Manifest诡计。这可能会有所帮助:stackoverflow.com/questions/5365787/… -
我同意这种需求应该在 Manifest 中声明
标签: scala types pattern-matching