我正在使用树和表达式列表(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有没有办法做到这一点?
答案 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]
}