从Object继承的方法呈现不明确

时间:2014-04-16 21:06:04

标签: scala

val x: AnyRef = 42
  

类型不匹配:找到Int(42)所需:AnyRef

     

注意:scala.Int => java.lang.Integer存在隐式,但从Object继承的方法呈现模糊不清。这是为了避免将任何scala.Int转换为任何AnyRef的全面隐含。

     

您可能希望使用类型归属:x: java.lang.Integer

我不理解强调的部分。什么方法变得模棱两可,怎么样?从Object继承的方法是否总是变得模糊不清"在斯卡拉?这是一种特殊情况,方法在一种类型中以某种方式多次结束?我只是不知道模棱两可的来源。

1 个答案:

答案 0 :(得分:2)

Scala必须假装Int在继承层次结构中位于与Java放置不同的位置。这会导致一些尴尬。

考虑方法notify。等待Int不起作用 - 它是一个原始的。等待新装的java.lang.Integer也不起作用,因为其他线程最终可能已经使用了自己单独装箱的Integer。您只是不希望notify使用Int - 这是错误的做法。

但如果您的转化Int => java.lang.Integer没有任何异常,那么能够在notify上致电Int

为了防止这种通常错误的行为,导致由于歧义而无法解决转换的机制被劫持。这会使Int => java.lang.Integer服务转换Int预期AnyRef(这将破坏继承层次结构),并阻止42.notifyAll之类的内容工作,因为即使java.lang.Integer有这种方法,推理机器不会注意到它。

您看到的消息应该涵盖42.notify案例,而不是42: AnyRef案例。