无法在Scala案例类中定义名为`wait`的属性

时间:2017-10-14 03:25:12

标签: scala

我正在尝试在wait case中定义属性class,但是,它一直给我一个错误:

  

重写方法在类中对等类型()单位;
  [错误]值等待不能覆盖最终成员
  [错误]最终案例类Foo(等待:Bar)

final case class Foo(wait: Bar)

看起来wait是基类中的一个方法,即使我的case类没有继承任何东西。有没有办法仍然定义一个名为wait的类变量?

2 个答案:

答案 0 :(得分:2)

不,当公共字段名称Object的方法相同时, Scala编译器无法处理此问题:

  • 通知
  • notifyAll的
  • 等待

由于当 Scala编译器符合公共字段时,它会生成默认的 getter ,对于您的示例,它将生成:

  public java.lang.String wait()

这会导致Object的等待方法出现名称冲突问题。但现在似乎编译器无法解决这个问题。

答案 1 :(得分:1)

您的类隐式继承自AnyRef / Object,因为每个引用类型都需要是AnyRef的子类型。您可以通过定义Foo extends AnyVal来解除此问题,但除非您知道what it means,否则确实不想这样做,因为您的班级不再是普通班级。只需将您的方法命名为别的。

wait是一个并发原语。它只是因为Java决定把它放在AnyRef中(也就是说,责怪Java,而不是Scala),它只在Object中。在synchronized块中调用时,调用线程将进入休眠状态,直到被同一对象上调用notifyAll)的其他线程唤醒为止。