val x: AnyRef = 42
type mismatch: found
Int(42)
required:AnyRef
Note: an implicit exists from
scala.Int => java.lang.Integer
, but methods inherited fromObject
are rendered ambiguous. This is to avoid a blanket implicit which would convert anyscala.Int
to anyAnyRef
.You may wish to use a type ascription:
x: java.lang.Integer
我不明白强调的部分。哪些方法会变得模棱两可,又是怎么来的?从 Object 继承的方法在 Scala 中是否总是“呈现模糊”?这是一种特殊情况,其中方法以某种方式在一个类型中多次结束?我只是不明白歧义来自哪里。
最佳答案
Scala 不得不假装 Int
在继承层次结构中的位置与 Java 放置的位置不同。这导致了一些尴尬。
考虑方法notify
.等待 Int
不起作用——它是一个原始的。等待新盒装java.lang.Integer
也不起作用,因为其他线程可能已经结束了自己的单独装箱Integer
s。你只是不想notify
在 Int
上工作——这是错误的做法。
但是如果你有转换 Int => java.lang.Integer
没有任何异常,您可以调用notify
在您的 Int
上.
为了防止这种通常错误的行为,由于歧义而无法解决转换的机制被劫持。这让 Int => java.lang.Integer
服务于转换Int
在哪里 AnyRef
是预期的(这会破坏继承层次结构),并防止像 42.notifyAll
这样的事情从工作开始,即使 java.lang.Integer
有这种方法,推理机器就不会注意到它。
您看到的消息应该涵盖 42.notify
案例比42: AnyRef
案子。
关于scala - 从 Object 继承的方法被渲染为模棱两可,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120135/