Sembra un po 'ridondante, ma la conversione A -> C
è esattamente ciò che si dovrebbe fornire. Il motivo è che se gli impliciti sono rari, le catene transitive sono anche rare e probabilmente sono ciò che si desidera. Ma se gli impliciti sono comuni, è probabile che sarete in grado di trasformare qualsiasi cosa in qualcosa (o, se aggiungete un implicito dall'aspetto pratico, improvvisamente cambieranno tutti i tipi di comportamento perché avete aperto diversi percorsi per la conversione implicita).
È possibile avere le conversioni implicite per Scala, tuttavia, se si specifica che deve essere eseguita. La chiave è usare i generici con <%
che significa "può essere convertito in". Ecco un esempio:
class Foo(i: Int) { def foo = i }
class Bar(s: String) { def bar = s }
class Okay(b: Boolean) { def okay = b }
implicit def to_bar_through_foo[T <% Foo](t: T) = new Bar((t: Foo).foo.toString)
implicit def to_okay_through_bar[U <% Bar](u: U) = new Okay((u: Bar).bar.length < 4)
scala> (new Foo(5)).okay
res0: Boolean = true
fonte
2012-03-04 19:10:22
Suggerimento: questo sembra più _transitivity_ che _associativity_. E tu non sei il primo a volerlo per gli impliciti di Scala. Anche 'A -> C' è probabilmente un errore di battitura per' B -> C' nella tua seconda riga? –
Grazie. Ero di fretta. –
anche dare un'occhiata a: [how-can-i-chain-implicits-in-scala] (http://stackoverflow.com/questions/5332801/how-can-i-chain-implicits-in-scala) –