今日、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 が機能しているようです。
恐ろしいランタイムキャストなしでこれを機能させる方法はありますか?同時に、型シグネチャを正確に文字列として保持しますか?
ありがとう