scala - 如何将 Scala 方法参数限制为 classOf[Exception] 或 classOf[Exception 的子类型]

标签 scala exception types

如何声明expectedException,才能只传递Exception和子类?目前我正在使用 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) {

我的问题是,如何声明expectedException,以便只传递异常和子类?目前我正在使用 expectedException: Any。

测试特性的完整源代码在这里, https://github.com/janekdb/stair-chess/blob/master/src/test/Test.scala

最佳答案

使用泛型:

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

这表示 expectedException 的类型 T 必须是 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]

关于scala - 如何将 Scala 方法参数限制为 classOf[Exception] 或 classOf[Exception 的子类型],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812684/

相关文章:

scala - 在 Actor 回答上添加延迟

python - 当 Python 3 中已经存在异常时引发异常

c# - 从通用委托(delegate)函数中获取参数类型

python - 如何创建与其他对象相同的类的新实例?

Java 未定义的泛型类型

scala - 下划线 "class needs to be abstract since method is not defined"错误

scala - 如何在 Intellij Idea 10 中运行 Scala 代码

scala - 使用来自另一列的键从 MapType 列查找值

java - 我可以使用动态变量(如时间)来构造静态最终变量(常量)

java - 如何在 lblText.steText() 中设置预定义消息