Scala:实现泛型类型检查

时间:2014-02-25 02:05:03

标签: scala generics type-erasure

我正在使用树和表达式列表(Exp,为简洁起见删除了成员。)

sealed abstract class Exp
abstract class BinaryExp extends Exp
case class Add extends BinaryExp

大多数时候我使用模式匹配来处理树或表达式列表。 但有时候这有点乏味,我希望能够写下来:

if (exp.isBinary) ...
//or 
exps.filter(_.isAdd) ...

但这意味着我需要在Exp中使用以下实现创建各种属性:

def isXXX = this.isInstanceOf[XXXExp]

由于类型擦除,我第一次尝试制作这种通用符号不起作用:

def is[T <: Exp] = this.isInstanceOf[T]

所以我搜索了一个解决方案并找到了TypeTags:
http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html
Scala: What is a TypeTag and how do I use it?

尝试使用TypeTag也不起作用:

sealed abstract class Exp {
  // Cannot use isInstanceOf because of type erasure.
  import reflect.runtime.universe._
  def is[T <: Exp: TypeTag] = typeOf[this.type] <:< typeOf[T]
  def as[T <: Exp] = asInstanceOf[T]
}

Scala有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以尝试Manifest(请注意,它在2.10中已弃用)。

  sealed abstract class Exp {
     def is[T <: Exp: Manifest] = implicitly[Manifest[T]].erasure.isInstance(this)  
     def as[T <: Exp] = asInstanceOf[T]
  }

示例:http://ideone.com/47Q5W3