我認為我對 Scala 有很好的理解,直到我發現自己處于這個簡單的場景中
sealed abstract case class Name private(name: String)
object Name {
def make(name: String): Option[Name] =
if (name.nonEmpty) Some(new Name(name) {}) else None
}
我的問題是關于private類的修飾符。如果我像這樣使用它,一切正常,但是如果我private在開始時移動關鍵字,就像
private sealed abstract case class Name(name: String) 它不能編譯因為給了我以下錯誤
私有類名稱將其定義范圍轉義為型別 Option[example.package.Name] 的一部分
example.package我正在使用的包物件在哪里。
我想我需要澄清一下,因為我不確定這里發生了什么
uj5u.com熱心網友回復:
在
sealed abstract case class Name(name: String)
Name 有效地表示兩者
- 班級名稱
- 該類的默認建構式
sealed abstract case class Name private(name: String)
宣告該類是公共的,但建構式是私有的(即只能從該類或其伴生物件中呼叫)。
private sealed abstract case class Name(name: String)
宣告該類是私有的(這意味著建構式也是私有的)。
uj5u.com熱心網友回復:
這段代碼編譯沒有錯誤:
private sealed abstract case class Name(name: String)
問題是您隨后回傳了一個包含public此類值的值,因此定義泄漏了,它實際上不是private. 你需要確保所有的參考Name也private。
第一種語法將建構式標記為私有;
sealed abstract case class Name private(name: String)
這意味著只能從Name伴隨物件內部呼叫構造函式。所以這是不允許的
val name = new Name("name") // constructor Name in class Name cannot be accessed
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384764.html
標籤:斯卡拉
下一篇:你如何把火和忘記未來變成理解?
