Не могу скастить стрингу в инт в implicit методе

Есть такое простой код:

  def main(args: Array[String]): Unit = {
    implicit def stringToInt(string: String): Int = string.toInt

    def sum(x: Int, y: Int): Int = {
      x + y
    }

    println(sum("1", "2"))
  }

Получаю такую ошибку:

type mismatch;
 found   : string.type (with underlying type String)
 required: ?{def toInt: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method augmentString in object Predef of type (x: String): scala.collection.StringOps
 and method stringToInt of type (string: String): Int
 are possible conversion functions from string.type to ?{def toInt: ?}
    implicit def stringToInt(string: String): Int = string.toInt

Подскажите, пожалуйста, в чем дело.


Ответы (1 шт):

Автор решения: BccHnw

В методе stringToInt вызывается метод toInt, который используется тот же механизм неявного преобразования, что и сам метод stringToInt. Из-за этого возникает коллизия определения: компилятор не знает, то ли использовать преобразование при помощи stringToInt, то ли (штатное) преобразование в StringOps.

Решается просто. Нужно использовать явное преобразование в Int:

  implicit def stringToInt(string: String): Int = Integer.parseInt(string)

  def sum(x: Int, y: Int): Int = {
    x + y
  }

  println(sum("1", "2"))

Т.е. вызов toInt заменен на Integer.parseInt(...)

→ Ссылка