2014-04-16 113 views
5
val x: AnyRef = 42 

类型不匹配:找到所需Int(42)AnyRef方法被渲染暧昧

注意:从scala.Int => java.lang.Integer隐式存在,但是从Object继承方法呈现暧昧。这是为了避免任何暗示,将任何scala.Int转换为任何AnyRef

您不妨使用类型归属:x: java.lang.Integer

我不明白的强调部分。哪些方法变得模糊不清,以及如何发生?在Scala中,从Object继承的方法总是“呈现不明确”?这是一种特殊的情况,方法以某种方式在某种类型中多次结束?我只是没有看到歧义来自何处。

回答

2

Scala不得不假装Int在继承层次结构中与Java不同的地方。这导致一些尴尬。考虑方法notify。等待Int不起作用 - 这是一个原始的。等待新盒装java.lang.Integer也不起作用,因为其他线程可能已结束与他们自己的分开盒Integer s。你只是不想让notifyInt上工作 - 这是错误的做法。

但如果你有转换Int => java.lang.Integer没有什么异常,你能够调用notifyInt

为了防止这种通常是错误的行为,未能解决由于歧义导致的转换的机制被劫持。这使Int => java.lang.Integer服务转换Int,其中AnyRef预计(这将打破继承层次结构),并防止像42.notifyAll这样的事情工作,因为即使java.lang.Integer具有该方法,推论机制不会注意它。

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

+0

您可以扩展“由于歧义被劫持而未能解决转换的机制”吗?这正是我不明白的地方。 – fredoverflow