Я пытаюсь добавить новые функции к существующим типам (чтобы IDE автоматически предлагала соответствующие функции для типов, которые я не могу контролировать, например Future[Option[A]]). Я исследовал как неявные классы, так и неявные преобразования, чтобы добиться этого, и оба они, похоже, предлагают одинаковое поведение.
Есть ли какая-либо эффективная разница между использованием неявного класса:
case class Foo(a: Int)
implicit class EnrichedFoo(foo: Foo) {
def beep = "boop"
}
Foo(1).beep // "boop"
И используя неявное преобразование:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit def fooToEnriched(foo: Foo) = new Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Я предполагаю, что одно отличие здесь может заключаться в том, что в первом примере вместо трейта создается одноразовый класс, но я мог бы легко адаптировать неявный класс для расширения абстрактного трейта, например:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit class EnrichedFoo(foo: Foo) extends Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"