0

今天在尝试向 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 正是它所得到的。根据这个线程,解决方法是T <: String在隐式类的类型签名中。看来Predef 可能在这里发挥作用

有没有办法在没有可怕的运行时强制转换的情况下让它工作,同时将类型签名完全保留为 String?

谢谢

4

1 回答 1

7

String您的代码中调用了两种类型。一个是,另一个是java.lang.String接受的类型参数。我猜使用作为类型参数是你的问题。它应该只需要作为其类型参数。StringEitherProvidesRollbackStringEitherProvidesRollbackB

于 2014-04-16T20:40:14.247 回答