Неявные преобразования в универсальной функции

Мне нужно преобразовать из Any в базовые числовые типы, такие как 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 и ограничив тип Tgeneric, но это не сработало.

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

Спасибо.


person Álvaro Valencia    schedule 29.06.2018    source источник


Ответы (1)


Вам также нужно добавить неявный аргумент convertAny need to 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 кажутся мне подозрительными, но это может быть просто рефлекторная реакция.

person Alexey Romanov    schedule 29.06.2018
comment
Спасибо!! Это сработало. Я потратил на это много времени, и это, наконец, сработало. anyToDouble/Int, который я показал, это всего лишь пример. Настоящий код сложнее. - person Álvaro Valencia; 29.06.2018