我正在尝试在wait
case
中定义属性class
,但是,它一直给我一个错误:
重写方法在类中对等类型()单位;
[错误]值等待不能覆盖最终成员
[错误]最终案例类Foo(等待:Bar)
final case class Foo(wait: Bar)
看起来wait
是基类中的一个方法,即使我的case类没有继承任何东西。有没有办法仍然定义一个名为wait
的类变量?
答案 0 :(得分:2)
不,当公共字段名称与Object的方法相同时, Scala编译器无法处理此问题:
由于当 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
块中调用时,调用线程将进入休眠状态,直到被同一对象上调用notify
(All
)的其他线程唤醒为止。