【问题标题】:Rabbit Hole: found String, required java.lang.String兔子洞:找到String,需要java.lang.String
【发布时间】:2014-05-31 22:15:51
【问题描述】:

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

谢谢

【问题讨论】:

    标签: scala type-signature predef


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多