有没有更好的方法来写这段代码呢?特别是,是否有可能在外部函数中进行转换?
nodes collect { case x: InstrumentSource[_] if (x.m <:< implicitly[ClassManifest[BarClose]]) => x.asInstanceOf[InstrumentSource[BarClose]] };InstrumentSource中的M是一个类清单:
case class InstrumentSource[A](implicit val m: ClassManifest[A])nodes是各种InstrumentSource的集合。
发布于 2011-11-11 03:35:10
我的想法是:
trait HasClassManifest[A] {
def m: ClassManifest[A]
}
object <-< {
def apply[A : ClassManifest](a: HasClassManifest[_]): Boolean = {
a.m <:< classManifest[A]
}
}
case class InstSource[A](implicit m: ClassManifest[A]) extends HasClassManifest[A]
Seq(InstSource[Long],InstSource[Double]) collect {
case x if <-<[Long](x) => println("long")
case x if <-<[Double](x) => println("double")
}(由于此处不滚动,已将InstrumentSource重命名为InstSource )
因此,代价是定义HasClassManifest和<-<一次,并且每个你想要模式匹配的类都必须扩展HasClassManifest。这就是全部。
但我不知道如何计算出右手边的instanceOf转换。
https://stackoverflow.com/questions/8080698
复制相似问题