Sto cercando di aggiungere nuove funzioni a tipi esistenti (così posso fare in modo che l'IDE suggerisca funzioni rilevanti per tipi di cui non ho il controllo, ad esempio Future[Option[A]]
). Ho esplorato sia le classi implicite che le conversioni implicite per ottenere questo risultato ed entrambe sembrano offrire lo stesso comportamento.Classe implicita rispetto alla conversione implicita in tratto
C'è qualche differenza tra l'utilizzo efficace una classe implicita:
case class Foo(a: Int)
implicit class EnrichedFoo(foo: Foo) {
def beep = "boop"
}
Foo(1).beep // "boop"
E l'utilizzo di una conversione implicita:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit def fooToEnriched(foo: Foo) = new Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Suppongo che una differenza qui potrebbe essere che il primo esempio crea un one fuori classe invece di un tratto, ma potrei facilmente adattare la classe implicita per estendere un tratto astratto, ad esempio:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit class EnrichedFoo(foo: Foo) extends Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Un'ulteriore cosa da ricordare è che, quando si desidera convertire implicitamente un oggetto di tipo A in un oggetto di tipo B, dove B è un * 'classe finale' *, un 'implicito def' è l'unica opzione. – Adowrath