Parece algo redundante, pero la conversión A -> C
es exactamente lo que debe proporcionar. La razón es que si las implícitas son raras, las cadenas transitivas también son raras, y probablemente sean lo que quieres. Pero si las implicaciones son comunes, es probable que puedas convertir cualquier cosa en algo (o, si agregas un aspecto práctico implícito, de repente todo tipo de comportamientos cambiarán porque has abierto caminos diferentes para la conversión implícita).
Puede hacer que Scala encamine las conversiones implícitas por usted, sin embargo, si especifica que se debe hacer. La clave es usar genéricos con <%
que significa "se puede convertir a". Aquí hay un ejemplo:
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
Sugerencia: esto se parece más a _transitivity_ than _associativity_. Y no eres la primera persona en querer esto para las implicaciones de Scala. También 'A -> C' es probablemente un error tipográfico para' B -> C' en su segunda línea? –
Gracias. Estaba en un apuro. –
también eche un vistazo a: [cómo-puedo-i-cadena-implícita-en-scala] (http://stackoverflow.com/questions/5332801/how-can-i-chain-implicits-in-scala) –