Подтвердить что ты не робот

Почему implicitConversions требуется для неявных defs, но не для классов?

Насколько я понимаю, неявные преобразования могут привести к потенциально трудному пониманию кода или кода, страдающего от других проблем (возможно, даже ошибок?), поэтому они требуют явного включения для использования в коде без получения предупреждений.

Однако, учитывая, что неявные преобразования в большой части (если не в большинстве случаев) используются для обертывания объекта с объектом другого типа, а также подразумеваемые классы - я бы оценил, что вы исправляете меня, если я неправильно, почему первые требуют импорта scala.language.implicitConversions, но последние не делают?

object Main extends App {
  implicit class StringFoo(x: String) {
    def fooWithImplicitClass(): Unit =
      println("foo with implicit class")
  }
  // => silence.

  "asd".fooWithImplicitClass()

  /************************/

  class Foo(x: String) {
    def fooWithImplicitDef(): Unit =
      println("foo with implicit def")
  }
  implicit def string2Foo(x: String) = new Foo(x)
  // => warning: implicit conversion method string2Foo should be enabled

  "asd".fooWithImplicitDef()
}
4b9b3361

Ответ 1

Неявные классы эффективно добавляют только новые методы (или черты), и они используются только когда используются эти дополнительные методы (или неявный класс используется явно, но это редко случается на практике). С другой стороны, неявные преобразования в существующие типы могут быть вызваны с меньшей видимостью для программиста.

Ответ 2

ИМО, нет фундаментального различия между неявным классом и неявным преобразованием в отношении путаницы, которую они могут потенциально понести, поэтому оба должны были быть предупреждены.

Но, определяя класс как неявный, он явно запрещает предупреждение, сообщая компилятору, что "я взрослый человек, я знаю, что я делаю. ЭТОТ КЛАСС ПРЕДНАЗНАЧЕН ДЛЯ ИСПОЛЬЗОВАНИЯ ЭТОТ ПУТЬ (возможно, как расширитель). Поэтому никаких предупреждений не будет, поскольку вы, как создатель класса, ясно дали понять, что использование неявно заключается в том, как должен работать этот класс или как разрешен класс, компилятор обязательно должен вам доверять.

С другой стороны, вы можете преобразовать объект в какой-либо класс, используя неявное преобразование, независимо от того, предполагается ли целевой класс использоваться неявно. Это источник многих проблем, а также то, что пытается предотвратить Scala.