繁体   English   中英

使用名为 Wait 的变量声明特征会导致覆盖编译器错误

[英]Declaring A Trait With A Variable Named Wait Gives Override Compiler Error

鉴于以下特征:

trait Foo {

  final val wait = "wait"

}

在编译时,它会发出以下覆盖编译器错误:

Value 'wait' cannot override final member

如上所述在特征内声明变量似乎与Object class 中的以下 Java 方法发生冲突:

    public final void wait() throws InterruptedException {
        this.wait(0L);
    }

这是错误还是期望的行为?

wait是在Object上的 Object 中定义的final方法。 任何其他 object 扩展java.lang.Object ,因此您不能覆盖/定义final的方法。

这是意料之中的,否则如果您尝试在 Java 代码中使用waitnotify ,其中 object 来自用 Scala 编写的部分代码,您最终会出现奇怪的行为。 实际上,Scala 试图持有 Java 定义为安全的所有合约。

这个答案中,您会看到val字段实际上还使用字段名称创建了一个 getter 方法 - 在您的情况下为wait() 由于这与Object上的最终wait()方法相冲突,这确实是意料之中的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM