Rabbit Hole:找到String,需要java.lang.String

时间:2014-04-16 20:35:52

标签: scala type-signature predef

在尝试向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?

由于

1 个答案:

答案 0 :(得分:6)

您的代码中有两种称为String的类型。一个是java.lang.String,另一个是String所采用的类型参数EitherProvidesRollback。我猜测使用String作为EitherProvidesRollback的类型参数是你的问题。它应该只需要B作为其类型参数。