首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换和类型擦除

转换和类型擦除
EN

Stack Overflow用户
提问于 2011-11-10 22:03:41
回答 1查看 116关注 0票数 2

有没有更好的方法来写这段代码呢?特别是,是否有可能在外部函数中进行转换?

代码语言:javascript
复制
nodes collect { case x: InstrumentSource[_] if (x.m <:< implicitly[ClassManifest[BarClose]]) => x.asInstanceOf[InstrumentSource[BarClose]] };

InstrumentSource中的M是一个类清单:

代码语言:javascript
复制
case class InstrumentSource[A](implicit val m: ClassManifest[A])

nodes是各种InstrumentSource的集合。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-11 03:35:10

我的想法是:

代码语言:javascript
复制
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转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8080698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档