3

查看 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
    }
  }
4

1 回答 1

3

这种语言结构称为类型参数化,您可以在此处阅读有关它的更多信息:

http://www.artima.com/pins1ed/type-parameterization.html

在这种情况下,方法也可以声明类型参数。如果您已经有一些 Java 背景,那么这里有一个非常相似的 Java 等价物:

public <T extends Object> T intercept(Runnable f) {
  // ...
}
于 2012-12-18T12:01:07.583 回答