Scala类型检查/断言作为函数与JVM类型擦除

时间:2017-03-01 10:15:54

标签: scala types pattern-matching

我有一些代码经常进行类型检查:

obj match {
  case _: Foo =>
    // everything is fine
  case _ =>
    throw SomeException(...)
}

它可以工作,但是它相对笨重,感觉就像大量的重复代码(特别是考虑到异常需要大量参数),所以我认为它会取代这个断言函数。但是,我天真的尝试失败了:

def assertType[T](obj: CommonType): Unit = {
  obj match {
    case _: T =>
      // everything is fine
    case _ =>
      throw SomeException(...)
  }
}

显然,由于JVM类型擦除,忽略了此T参数,因此第一种情况分支始终为true。 ⇒ Full source code demonstrating the problem

当然,人们可以采用Java的反射方法,但这种方法既慢又丑,不可移植。在Scala中执行此类断言的首选方法是什么?

有些相关,但没有解决这个问题:

1 个答案:

答案 0 :(得分:3)

也传递清单:

def assertType[T : Manifest](obj: CommonType): Boolean

您的示例代码将正常运行:

v1 is Foo = true
v1 is Bar = false
v2 is Foo = false
v2 is Bar = true