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()不能按要求工作,但是我想将错误消息设置为用户可读的东西.目前消息是
解决方法
在这里使用类型参数有点过分.最好从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" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |