Это тип параметра - [T <: AnyRef]
Посмотрим на сигнатуру метода 'intercept' в тесте 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
}
}
1 ответ
Решение
Эта языковая конструкция называется параметризацией типа, и вы можете прочитать больше об этом здесь:
http://www.artima.com/pins1ed/type-parameterization.html
В этом случае метод также может объявить параметр типа. Если у вас уже есть некоторый Java-фон, то здесь очень похож Java-эквивалент:
public <T extends Object> T intercept(Runnable f) {
// ...
}