Неявные преобразования в обобщенную функцию - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно конвертировать из любого в базовые числовые типы, такие как Int или Double Я реализовал эти преобразования, используя импликации Scala. Мой код похож на этот:

  def convertAny[T](any: Any)(implicit run: Any => Option[T]) = run.apply(any)
  implicit def anyToDouble(any: Any) = Try(any.asInstanceOf[Double]).toOption
  implicit def anyToInt(any: Any) = Try(any.asInstanceOf[Int]).toOption

Проблема в том, что мне нужно выполнить эти преобразования внутри обобщенной функции, подобной этой:

  def doStuffAndConvert[T](i: Any): Option[T] = {
    // Some pre-processing
    println("Processing data...")

    convertAny[T](i)
  }

Это вызов doStuffAndConvert:

doStuffAndConvert[Double](a)

Однако компилятор выдает эту ошибку:

Error:(40, 18) No implicit view available from Any => Option[T].
    convertAny[T](i)

Я пытался помочь компилятору, обернув типы Int и Double и ограничив универсальный тип T, но это не сработало.

Как я мог это исправить?

Спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Вам необходимо добавить неявный аргумент convertAny, а также doStuffAndConvert:

def doStuffAndConvert[T](i: Any)(implicit run: Any => Option[T]): Option[T] = {
  // Some pre-processing
  println("Processing data...")

  convertAny[T](i) // or just i, the implicit will be used anyway
}

Отражения вроде anyToDouble/Int выглядят для меня подозрительно, но это может быть просто реакция на колено.

...