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

scala – 类型安全的Builder:如何设置编译器错误消息

发布时间:2020-12-16 09:05:48 所属栏目:安全 来源:网络整理
导读:我在类型安全构建器模式中使用幻像类型,以确保只调用一次方法,如下面的代码示例所示 sealed trait TBoolean sealed trait TTrue extends TBoolean sealed trait TFalse extends TBoolean class Builder[MethodCalled : TBoolean] private() { def foo()(impl
我在类型安全构建器模式中使用幻像类型,以确保只调用一次方法,如下面的代码示例所示

sealed trait TBoolean
  sealed trait TTrue extends TBoolean
  sealed trait TFalse extends TBoolean

  class Builder[MethodCalled <: TBoolean] private() {

    def foo()(implicit ev: MethodCalled =:= TFalse): Builder[TTrue] = {
      new Builder[TTrue]
    }
  }

  object Builder {
    def apply() = new Builder[TFalse]()
  }

Builder().foo().foo()不能按要求工作,但是我想将错误消息设置为用户可读的东西.目前消息是

Multiple markers at this line
– not enough arguments for method foo: (implicit ev: =:=[W.TTrue,W.TFalse])W.Builder[W.TTrue]. Unspecified value parameter ev.
– Cannot prove that W.TTrue =:= W.TFalse.
– Cannot prove that W.TTrue =:= W.TFalse.

解决方法

在这里使用类型参数有点过分.最好从foo方法返回一个功能较少的类型:

object Builder {
  trait CanFoo { def foo() : Builder }
  def apply(): Builder with CanFoo = new Builder with CanFoo {
    def foo() = new Builder {}
  }
}
trait Builder

Builder().foo().foo() // value foo is not a member of Builder

有一个注释implicitNotFound,其中can be used用于自定义错误消息,但需要使用所寻找的类型(=:=)来定义,而不是使用use site(foo),so that is a pretty useless construction ……

…除非你为=:=创建自己的替代品:

import annotation.implicitNotFound

object Called {
  implicit def same[A]: Called[A,A] = instance.asInstanceOf[Called[A,A]]
  private object instance extends Called[Any,Any]
}
@implicitNotFound(msg = "Cannot call this method twice") sealed trait Called[A,B]

class Builder[Foo <: TBoolean] private() {
  def foo()(implicit ev: Called[Foo,TFalse]): Builder[TTrue] = {
    new Builder[TTrue]
  }
}
object Builder {
  def apply() = new Builder[TFalse]()
}

Builder().foo().foo()  // -> "error: Cannot call this method twice"

(编辑:李大同)

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

    推荐文章
      热点阅读