Mat*_*dan 6 scala implicit-conversion
在我的代码中的某个时刻,我想在A上调用C方法.这可能吗?我提出的一个修复是从A - > C转换,但这似乎有点多余.
注意:
谢谢 ...
你写这个问题时似乎写错了.你的意思是说你有来自A -> B和的隐式转换B -> C,并且你发现A -> C转换是多余的?
Scala有一个规则,它只会在必要时应用一个隐式转换(但绝不会是两个),因此您不能仅仅期望Scala能够神奇地构成A -> B并B -> C进行所需的转换.您需要提供自己的A -> C转化.这不是多余的.
它似乎有点多余,但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)
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |