gpt4 book ai didi

generics - Scala - 如何执行 "assertThrows"方法?

转载 作者:行者123 更新时间:2023-12-02 08:02:25 24 4
gpt4 key购买 nike

我昨天开始学习 Scala,所以我对它还很陌生。学习一门新语言时我喜欢做的一件事是尝试创建一个微型 TDD 库。

这是我到目前为止得到的:

def assert(condition: Boolean, message: String) {
if(!condition){ throw new AssertionError(message) }
}

def assertThrows[E](f: => Unit) {
try {
f
} catch {
case e: E => { return }
case _: Exception => { }
}
throw new AssertionError("Expected error of type " + classOf[E] )
}

assert的代码工作得很好,但我有两个问题 assertThrows .

  • 好像不能用E在最后一行。无论我做什么,我都会得到 class type expected but E found error .
  • 如果我从最后一行删除 E (例如,将其替换为 throw new AssertionError("error expected") ),我会得到: warning: abstract type E in type pattern is unchecked since it is eliminated by erasure

我认为我遇到的两个问题与 Scala(可能还有 java)处理抽象类型的方式以及它们是如何完成的有关。

如何修复我的断言抛出?

加分:我指定“ block 类型”( f: => Unit ) 的方式正确吗?

最佳答案

Java 虚拟机通过类型删除来实现泛型,因此在方法体内,JVM 实际上并不知道 E 类型是什么,因此这个 AssertThrows 方法无法按照您希望的方式工作。您需要隐式传递异常类的 list ,如下所示:

def assertThrows[E](f: => Unit)(implicit eType:ClassManifest[E]) {

然后你可以在正文中使用它来捕获异常或获取类名,如下所示:

  try {
f
} catch {
case e: Exception =>
if ( eType.erasure.isAssignableFrom(e.getClass))
return;
}
throw new AssertionError("Expected error of type " + eType.erasure.getName )
}

感谢the Spring framework's AssertThrows class向我展示如何做到这一点。

关于generics - Scala - 如何执行 "assertThrows"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com