在尝试向Either添加隐式方法时,今天遇到了一个非常奇怪的问题。
implicit class EitherProvidesRollback[String,B](e: Either[String,B]) {
def rollback(
ss: Option[Session], overrideMsg: Option[String]): Either[String,B] = {
e.fold(
msg=> {
ss.map(_.rollback)
// found String required java.lang.String, FTW
// Left(i18n(overrideMsg.getOrElse(msg)))
// behold, the horrible hack
Left(i18n(overrideMsg.getOrElse(msg).toString).asInstanceOf[String])
},
Right(_)
)
}
}
i18n方法接受一个字符串,其中AFAICT正是它所获得的。解决方法,per this thread,在隐式类'类型签名中为T <: String
。它显示为Predef might be at play here。
有没有办法让这个工作没有可怕的运行时转换,同时保持类型签名正好是String?
由于
答案 0 :(得分:6)
您的代码中有两种称为String
的类型。一个是java.lang.String
,另一个是String
所采用的类型参数EitherProvidesRollback
。我猜测使用String
作为EitherProvidesRollback
的类型参数是你的问题。它应该只需要B
作为其类型参数。