scala - 从 Object 继承的方法被渲染为模棱两可

标签 scala

val x: AnyRef = 42

type mismatch: found Int(42) required: AnyRef

Note: an implicit exists from scala.Int => java.lang.Integer, but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to any AnyRef.

You may wish to use a type ascription: x: java.lang.Integer



我不明白强调的部分。哪些方法会变得模棱两可,又是怎么来的?从 Object 继承的方法在 Scala 中是否总是“呈现模糊”?这是一种特殊情况,其中方法以某种方式在一个类型中多次结束?我只是不明白歧义来自哪里。

最佳答案

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

考虑方法notify .等待 Int不起作用——它是一个原始的。等待新盒装java.lang.Integer也不起作用,因为其他线程可能已经结束了自己的单独装箱Integer s。你只是不想notifyInt 上工作——这是错误的做法。

但是如果你有转换 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/

相关文章:

java - 无法创建文件/目标/流/编译/运行/$global/streams/outjava.io.IOException :Too many open files

scala - 当使用 Futures 执行上下文的其他实现时,程序永远不会结束

string - 可以在 Scala 中使用自定义字符串插值字符吗?

java - 加特林机的替代品

scala - 如何模式匹配继承树中的抽象父类

scala - 如何在 Scala 中实现 DAO?

java - 从 Maven/WebJars 加载了不正确的 JavaScript 库版本

Eclipse Scala 插件不显示 scala 项目中的类和方法的文档

Scala - 推断类型参数

java - 如何阻止 intellij 转换我的代码?