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 が機能しているようです

恐ろしいランタイムキャストなしでこれを機能させる方法はありますか?同時に、型シグネチャを正確に文字列として保持しますか?

ありがとう

4

1 に答える 1

7

コードで呼び出される 2 つのタイプがありStringます。1 つはjava.lang.String、もう 1 つは受け取る型パラメーターStringですEitherProvidesRollbackStringを型パラメーターとして使用することEitherProvidesRollbackが問題だと思います。B型パラメーターとしてのみ必要です。

于 2014-04-16T20:40:14.247 に答える