Это кажется несколько избыточным, но преобразование A -> C
- это именно то, что вы должны предоставить.Причина в том, что если последствия редки, транзитивные цепочки также редки, и, вероятно, то, что вы хотите.Но если последствия распространены, есть вероятность, что вы сможете превратить что-либо во что-либо (или, если вы добавите неявный на вид удобный, вдруг все виды поведения изменится, потому что вы открыли разные пути для неявного преобразования).
Однако вы можете включить в Scala цепочку неявных преобразований, если вы укажете, что это должно быть сделано.Ключ в том, чтобы использовать дженерики с <%
, что означает «можно преобразовать в».Вот пример:
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