在我的代码中的某个时刻,我想在A上调用C方法。这可能吗? 我提出的一个修复方法是从A转换为> C但这似乎有点多余。
注意:
谢谢...
答案 0 :(得分:9)
当你写这个问题时,你似乎写错了。你的意思是说你有来自A -> B
和B -> 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