下面的代码不起作用,但它应该根据“不耐烦的
Scala”书(请参阅下面的摘录).那我在这里怎么理解?在Scala的最新版本中,隐式转换的规则是否发生了变化(2.8 vs. 2.10)?
编辑:
看了这个question后,我意识到b.hello需要改为(b:A).hello.这不是很含蓄.有没有办法解决?
编辑2:
在阅读了更多的this之后,似乎除了导入之外别无他法.
object A { implicit def b2a(b:B)=new A } class A{ def hello=println("hello") } class B object ImplicitConversion extends App{ val b=new B b.hello }
解决方法
那是因为Scala编译器无法通过查看这段代码来弄清楚你想要将B转换为A:
val b = new B b.hello // I know the source type is B,but what's the target type?
考虑一个类似于你的C的情况.Sca选择哪两个转换?要求Scala搜索系统中的所有其他伴随对象以获取可能已知的源类型的隐式转换,这太过分了.它很可能最终会产生模棱两可的结果.
在您的情况下,最简单的解决方案是将B从A的伴随对象转移到A的伴随对象.
class A { def hello=println("hello") } class B object B { implicit def b2a(b:B)=new A } object ImplicitConversion extends App { val b=new B b.hello }