val x: AnyRef = 42
类型不匹配:找到
Int(42)
所需:AnyRef
注意:
scala.Int => java.lang.Integer
存在隐式,但从Object
继承的方法呈现模糊不清。这是为了避免将任何scala.Int
转换为任何AnyRef
的全面隐含。您可能希望使用类型归属:
x: java.lang.Integer
我不理解强调的部分。什么方法变得模棱两可,怎么样?从Object继承的方法是否总是变得模糊不清"在斯卡拉?这是一种特殊情况,方法在一种类型中以某种方式多次结束?我只是不知道模棱两可的来源。
答案 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
案例。