Scala传递隐式转换

时间:2012-03-04 18:30:39

标签: scala implicit-conversion

  • 我有3个Scala类(A,B,C)。
  • 我有一个隐含的转换来自A - > B和B中的一个 - >下进行。

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

注意:

  • 当我在A上调用B方法时,它可以工作。
  • 当我在B上调用C方法时,它可以工作。
  • 当我在A上调用C方法时,它说它在A的主体中找不到方法

谢谢...

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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