2017-10-14 15 views
1

我想在caseclass來定義屬性wait,然而,它不斷給我一個錯誤:不能定義一個名爲`wait` Scala的情況下,類屬性

overriding method wait in class Object of type()Unit;
[error] value wait cannot override final member
[error] final case class Foo(wait: Bar)

final case class Foo(wait: Bar) 

它看起來像wait是基類中的一種方法,即使我的case類沒有從任何東西繼承。有沒有辦法仍然定義一個名爲wait的類變量?

回答

2

沒有,Scala編譯器不能處理這個時候公共字段名是相同Object的方法:

  • 通知
  • notifyAll的
  • 等待

從什麼時候開始Scala編譯器符合公共領域,它會生成默認吸氣,爲您的例子,它會產生:

public java.lang.String wait() 

這將導致名稱衝突問題與Object的wait方法。但似乎現在編譯器不能處理這一點。

1

您的類隱式繼承AnyRef/Object,因爲每個引用類型都必須是AnyRef的子類型。你可以通過定義Foo extends AnyVal來逃避,但你真的不想這樣做,除非你知道what it means,因爲你的課程不再是一個普通的課程。只要將你的方法命名爲別的。

wait是一個併發原語。它只是在AnyRef之中,因爲Java決定把它放在Object(也就是說,歸咎於Java而不是Scala)。當在​​塊內調用時,調用線程將進入休眠狀態,直到它被同一對象上的其他調用notifyAll)的線程喚醒。

相關問題