加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

泛型 – Scala – 如何进行“assertThrows”方法?

发布时间:2020-12-16 18:55:30 所属栏目:安全 来源:网络整理
导读:我昨天开始学习 Scala,所以我对它很陌生.在学习新语言时,我喜欢做的一件事是尝试创建一个微TDD库. 这是我到目前为止所得到的: def assert(condition: Boolean,message: String) { if(!condition){ throw new AssertionError(message) }}def assertThrows[E]
我昨天开始学习 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.无论我做什么,我得到一个类型预期,但E找到错误.
>如果我从最后一行删除E(例如,通过抛出新的AssertionError(“错误预期”)替换它)我得到:警告:类型模式中的抽象类型E未被选中,因为它被删除消除

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

我该如何修复我的assertThrows?

加分点:我指定“块类型”(f:=>单位)的方式是正确的吗?

解决方法

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

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向我展示了如何做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读