Неявные преобразования применяются там, где это не требуется

Scala применяет неявные преобразования там, где это не требуется, и приводит к сбою компиляции с ошибкой «Несоответствие типов».

Пример:

import scala.language.implicitConversions

case class Result(value: String)

implicit def intToResult(v: Int): Result = Result(v.toString)

val res: Result = Some(100).getOrElse(200/*wrong implicit intToResult call*/)

Ошибка:

Error:(7, 46) type mismatch;
found   : Any
required: Result
val res: Result = Some(100).getOrElse(200)

Выражение Some(100).getOrElse(200) должно возвращать Int, а scala должна преобразовать его в Result, используя intToResult посредством неявного преобразования.

Но Scala неявно применяет intToResult также к компиляции, нарушающей значение getOrElse.

IntelliJ не показывает никаких ошибок при написании этого выражения, не выделяет синтаксис.

Тесты:

  • Скала 2.11.8
  • Скала 2.13.0

person David Geirola    schedule 08.07.2019    source источник
comment
Это хороший пример того, почему неявные преобразования являются злом ТМ и их следует избегать. Всегда лучше использовать методы расширения.   -  person Luis Miguel Mejía Suárez    schedule 08.07.2019
comment
@LuisMiguelMejíaSuárez Я согласен с вами! К сожалению, я работаю над устаревшим кодом...   -  person David Geirola    schedule 09.07.2019
comment
Возможно, вы сможете реорганизовать неявное преобразование для метода расширения asResult. Я знаю, что, возможно, это была бы титаническая работа... но кто-то должен это сделать ;) Кроме того, компилятор должен просто пометить все места, где отсутствует преобразование, как ошибку проверки типа. И, наконец, если это действительно титаническая работа, возможно, оставьте оба варианта, но прекратите использовать преобразование и используйте метод расширения для нового кода и постепенно заменяйте старый. Удачи.   -  person Luis Miguel Mejía Suárez    schedule 09.07.2019