Ich versuche, neue Funktionen zu bestehenden Typen hinzuzufügen (so kann ich die IDE automatisch relevante Funktionen für Typen vorschlagen, die ich nicht kontrollieren kann, zB Future[Option[A]]
). Ich habe sowohl implizite Klassen als auch implizite Konvertierungen untersucht, um dies zu erreichen, und beide scheinen dasselbe Verhalten zu bieten.Implizite Klasse vs Implizite Umwandlung in Eigenschaft
Gibt es einen effektiven Unterschied zwischen einer implizite Klasse mit:
case class Foo(a: Int)
implicit class EnrichedFoo(foo: Foo) {
def beep = "boop"
}
Foo(1).beep // "boop"
Und mit einer impliziten Konvertierung:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit def fooToEnriched(foo: Foo) = new Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Ich nehme ein Unterschied könnte sein, dass das erste Beispiel erzeugt ein ein- Aus Klasse anstelle von Merkmal, aber ich könnte leicht die implizite Klasse anpassen, um eine abstrakte Eigenschaft zu erweitern, zB:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit class EnrichedFoo(foo: Foo) extends Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Eine zusätzliche Sache zu erwähnen ist, dass, wenn Sie implizit ein Objekt des Typs A in ein Objekt des Typs B konvertieren wollen, wobei B eine * final class' * ist, ist ein "implizites def" die einzige Option. – Adowrath