查看scala测试中“拦截”的方法签名:
def intercept[T <: AnyRef](f: => Any)(implicit manifest: Manifest[T]): T = {
我不知道如何使用[T <: AnyRef]
?这看起来像一个参数类型,但为什么它包含在有角度的括号内 - []?
这是完整的方法:
def intercept[T <: AnyRef](f: => Any)(implicit manifest: Manifest[T]): T = {
val clazz = manifest.erasure.asInstanceOf[Class[T]]
val caught = try {
f
None
}
catch {
case u: Throwable => {
if (!clazz.isAssignableFrom(u.getClass)) {
val s = Resources("wrongException", clazz.getName, u.getClass.getName)
throw newAssertionFailedException(Some(s), Some(u), 4)
}
else {
Some(u)
}
}
}
caught match {
case None =>
val message = Resources("exceptionExpected", clazz.getName)
throw newAssertionFailedException(Some(message), None, 4)
case Some(e) => e.asInstanceOf[T] // I know this cast will succeed, becuase iSAssignableFrom succeeded above
}
}
答案 0 :(得分:3)
这种语言结构称为类型参数化,你可以在这里阅读更多相关信息:
http://www.artima.com/pins1ed/type-parameterization.html
在这种情况下,方法也可以声明类型参数。如果你已经有了一些Java背景,那么这里有非常相似的Java等价物:
public <T extends Object> T intercept(Runnable f) {
// ...
}