我有一些代码经常进行类型检查:
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中执行此类断言的首选方法是什么?
有些相关,但没有解决这个问题:
答案 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