Кроличья нора: найдена строка, требуется java.lang.String

Сегодня столкнулся с действительно странной проблемой при попытке добавить неявный метод в Both.

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?

Спасибо


person virtualeyes    schedule 16.04.2014    source источник


Ответы (1)


В вашем коде есть два типа, называемые String. Один — java.lang.String, другой — параметр типа String, который принимает EitherProvidesRollback. Я предполагаю, что использование String в качестве параметра типа для EitherProvidesRollback - это ваша проблема. Он должен требовать только B в качестве параметра типа.

person wingedsubmariner    schedule 16.04.2014