Scala传递隐式转换

Mat*_*dan 6 scala implicit-conversion

  • 我有3个Scala类(A,B,C).
  • 我有一个隐含的转换,从A - > B和一个来自B - > C.

在我的代码中的某个时刻,我想在A上调用C方法.这可能吗?我提出的一个修复是从A - > C转换,但这似乎有点多余.

注意:

  • 当我在A上调用B方法时,它可以工作.
  • 当我在B上调用C方法时,它可以工作.
  • 当我在A上调用C方法时,它表示它没有在A的主体中找到该方法

谢谢 ...

Ken*_*oom 9

你写这个问题时似乎写错了.你的意思是说你有来自A -> B和的隐式转换B -> C,并且你发现A -> C转换是多余的?

Scala有一个规则,它只会在必要时应用一个隐式转换(但绝不会是两个),因此您不能仅仅期望Scala能够神奇地构成A -> BB -> C进行所需的转换.您需要提供自己的A -> C转化.这不是多余的.

  • 这种情况的一个原因是中间类型可能存在多种可能性.如果存在隐式转换"A - > B1","B1 - > C"和"A - > B2","B2 - > C",编译器将无法猜出您想要哪一个. (4认同)

Rex*_*err 6

它似乎有点多余,但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
Run Code Online (Sandbox Code Playgroud)