val x: AnyRef = 42
类型不匹配:找到Int(42)required:AnyRef注意:scala.Int => java.lang.Integer中存在隐式,但从Object继承的方法呈现不明确 . 这是为了避免将任何scala.Int转换为任何AnyRef的全局隐式 . 您可能希望使用类型ascription:x:java.lang.Integer
我不明白强调的部分 . 什么方法变得模棱两可,怎么样?在Scala中,从Object继承的方法总是“呈现模糊”吗?这是一种特殊情况,方法在一种类型中以某种方式多次结束?我只是没有看到模棱两可的来源 .
1 回答
Scala必须假装
Int
在继承层次结构中与Java放置在不同的位置 . 这导致一些尴尬 .考虑方法
notify
. 等待一个原始的Int
不是't work--it' . 等待一个新装箱的java.lang.Integer
也不起作用,因为其他线程可能已经结束了他们自己的单独装箱的Integer
. 你只是不希望notify
处理Int
- 这是错误的事情 .但如果您的转换
Int => java.lang.Integer
没有任何异常,您可以在Int
上调用notify
.为了防止这种通常错误的行为,由于歧义而无法解决转换的机制被劫持 . 这使得
Int => java.lang.Integer
用于转换Int
,其中AnyRef
是预期的(这将破坏继承层次结构),并阻止像42.notifyAll
这样的事情工作,因为即使java.lang.Integer
具有该方法,推理机制也不会注意到它 .您看到的消息应该涵盖
42.notify
案例而不是42: AnyRef
案例 .