首页 文章

从Object继承的方法呈现不明确

提问于
浏览
5
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 回答

  • 2

    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 案例 .

相关问题