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
asResult
. Я знаю, что, возможно, это была бы титаническая работа... но кто-то должен это сделать ;) Кроме того, компилятор должен просто пометить все места, где отсутствует преобразование, как ошибку проверки типа. И, наконец, если это действительно титаническая работа, возможно, оставьте оба варианта, но прекратите использовать преобразование и используйте метод расширения для нового кода и постепенно заменяйте старый. Удачи. - person Luis Miguel Mejía Suárez   schedule 09.07.2019