【问题标题】:methods inherited from Object are rendered ambiguous从 Object 继承的方法被渲染为模棱两可
【发布时间】:2014-04-16 21:06:03
【问题描述】:
val x: AnyRef = 42

类型不匹配:发现Int(42) 需要:AnyRef

注意:隐式存在于scala.Int => java.lang.Integer,但Object 继承的方法会变得不明确。这是为了避免将任何 scala.Int 转换为任何 AnyRef 的一揽子隐式。

您可能希望使用类型归属:x: java.lang.Integer

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

【问题讨论】:

    标签: scala


    【解决方案1】:

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

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

    但如果您的转换Int => java.lang.Integer 没有任何异常,您可以在您的Int 上调用notify

    为了防止这种通常错误的行为,由于歧义而无法解决转换的机制被劫持。这使Int => java.lang.Integer 服务于转换Int 预期AnyRef 的位置(这将破坏继承层次结构),并防止42.notifyAll 之类的东西工作,因为即使java.lang.Integer 有这种方法,推理机制也会保留从注意到它。

    您看到的消息应该涵盖42.notify 案例而不是42: AnyRef 案例。

    【讨论】:

    • 您能否详细说明“由于歧义而无法解决转换的机制被劫持”?这正是我不明白的。
    猜你喜欢
    • 2012-09-29
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多