Не удается разрешить символ X при определении нескольких неявных значений - PullRequest
1 голос
/ 31 мая 2019

Я тестирую некоторый код, показанный ниже, который в основном определяет несколько неявных val s, принимающих строку в качестве входных данных и преобразующих ее в соответствующие типы.

Проблема, с которой я столкнулся, заключается в том, что преобразования типа toLong, toDouble и toInt по какой-то причине становятся нерешенными.

class Parse[T](val f: String => T) extends (String => T) {
  def apply(s: String): T = f(s)
}

object Parse {
  def apply[T](f: String => T) = new Parse[T](f)

  implicit val parseLong: Parse[Long] = Parse[Long](s => s.toLong)
  implicit val parseDouble: Parse[Double] = Parse[Double](s => s.toDouble)
  implicit val parseInt: Parse[Int] = Parse[Int](s => s.toInt)
}

Что не так с этим кодом?

1 Ответ

4 голосов
/ 31 мая 2019

Дело в том, что, поскольку Parse расширяет String => T, имплициты parseLong, parseDouble, parseInt определяют не только экземпляры Parse, но и неявные преобразования String => Long, String => Double, String => Int.А поскольку .toLong, .toDouble, .toInt являются методами расширения, это создает неоднозначности.

Вы можете удалить extends (String => T) или разрешить методы расширения вручную:

object Parse {
  def apply[T](f: String => T) = new Parse[T](f)

  implicit val parseLong: Parse[Long] = Parse[Long](s => new StringOps(s).toLong)
  implicit val parseDouble: Parse[Double] = Parse[Double](s => new StringOps(s).toDouble)
  implicit val parseInt: Parse[Int] = Parse[Int](s => new StringOps(s).toInt)
}
...