Próbuję dodać nowe funkcje do istniejących typów (więc mogę mieć auto IDE zasugerować odpowiednie funkcje dla typów nie mam kontroli nad np Future[Option[A]]
). Zbadałem zarówno niejawne klasy, jak i niejawne konwersje, aby to osiągnąć i oba wydają się oferować to samo zachowanie.niejawny klasa vs niejawna konwersja do trait
Czy istnieje skuteczny różnica między używaniem niejawny Klasa:
case class Foo(a: Int)
implicit class EnrichedFoo(foo: Foo) {
def beep = "boop"
}
Foo(1).beep // "boop"
i korzystania niejawna konwersja:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit def fooToEnriched(foo: Foo) = new Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Przypuszczam jedna różnica tutaj może być tak, że pierwszy przykład tworzy jedno- poza klasą zamiast cechą, ale mogłem z łatwością dostosować ukrytą klasę do rozszerzenia abstrakcyjnej cechy, np .:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit class EnrichedFoo(foo: Foo) extends Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Jedna dodatkowa rzeczą wspomnieć, że kiedy chcesz niejawnie przekonwertować obiekt typu A do obiektu typu B, gdzie B jest ostateczna class' * '*' niejawny def' jest to jedyna opcja. – Adowrath