Как ограничить параметр метода Scala для classOf [Exception] или classOf [подтип Exception] - PullRequest
2 голосов
/ 22 марта 2012

Как можно объявить ожидаемое исключение, чтобы можно было передавать только исключения и подклассы?В настоящее время я использую expectedException: Any.

Подробности .

У меня есть метод тестовой утилиты, который вызывается так:

assertExceptionThrown("En-passant should be rejected when the previous move was not a double advance", classOf[UnreachablePositionException] ) {
  e.rejectIllegalMove(EnPassant("e5", "d6"))
}

Вторым аргументом первого списка параметров является classOf [SomeException].Это сигнатура метода теста,

  // TODO: Restrict expectedException to Exception or subclass
  def assertExceptionThrown(assertion: String, expectedException: Any)(b:  => Unit) {

Мой вопрос: как можно объявить ожидаемое исключение, чтобы можно было передавать только исключения и подклассы?В настоящее время я использую Ожидаемое Исключение: Любой.

Полный источник черты Тест здесь, https://github.com/janekdb/stair-chess/blob/master/src/test/Test.scala

1 Ответ

10 голосов
/ 22 марта 2012

Используйте дженерики:

def assertExceptionThrown[T <: SomeException](assertion: String, expectedException: Class[T])(b:  => Unit)

Это говорит о том, что тип T из expectedException должен быть SomeException или его подкласс.

Демонстрация:

class A
class B extends A
def f[T <: A](x: Class[T]) {}   // f accepts Class[A] or a Class[subclass of A]

f(classOf[A])   // fine
f(classOf[B])   // fine
f(classOf[Int]) // error: inferred type arguments [Int] do not conform to method f's type parameter bounds [T <: A]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...