需要导入伴随对象中的隐式转换方法?矛盾与“斯卡拉为不耐烦”的书

下面的代码不起作用,但它应该根据“不耐烦的 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
}

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...