簡體   English   中英

Scala中的“案例類擴展特質”是什么意思?

[英]What does “case class extends trait” mean in Scala?

我正在理解我現有的項目,但我無法理解的幾件事:

trait PeriodA {
  def start: Long
  def stop: Long
  def description: String
  def manageTo: String
}

case class PeriodEntity(
  start: Long,
  stop: Long,
  description: String,
  manageTo: String)
  extends PeriodA

你能解釋一下發生了什么嗎?

一步步:

  • trait PeriodA {trait PeriodA {定義(大致是一個接口–為了進一步理解,請閱讀spec

  • def start: Long def stop: Long def description: String def manageTo: String –定義了“待命”特征的特性。 您可以將它們視為Java getFieldName函數。

  • case class PeriodEntity “案例類”的case class PeriodEntity定義比一般的定義稍微復雜一些。 簡而言之,該定義使編譯器向該定義的每個所謂的“元素”(字段)隱式添加val前綴。 它還使用apply/unapply函數對定義了伴隨對象,這在您要使用模式匹配時很方便,但這不在當前主題之內。 案例類別規范

  • start: Long, stop: Long, description: String, manageTo: String –構造函數參數和類字段的定義,稱為“元素”。 至於編譯器使用val前綴隱式標記元素,則應將它們視為不可變的。 如前所述,可以將它們視為get訪問器。

  • extends PeriodA -宣稱類PeriodEntity混入(實現) PeriodA接口。 只要編譯器將類元素隱式地視為val,就無需顯式實現或重寫抽象PeriodA方法-編譯器會將元素視為您的默認實現。

感謝您讓我理解我,我想分享我的理解,

trait PreridA只是一個接口有4種get方法。

case class PeriodEntity extends PeriodA -PeriodEntity應該具有4個get方法,如PeriodA所述。 如果刪除了PeriodEntity中的任何文件,則將獲得編譯異常。 簡單來說,它就像一個類實現了一個接口。

對於這類誤解,我有解決方案。 為此,您應該具有Java的基本知識。

  1. 將您不了解的代碼放入單獨的新Scala類中。
  2. 使其沒有編譯問題。
  3. 如果需要,請重建項目,然后它將在目標中創建.class文件。
  4. 使用任何Decompiler jd-GUI或其他。
  5. 或者,cd <..> \\ target \\ scala-2.11 \\ classes運行

    javap package.Employee

  6. 您將在控制台中看到Java代碼。

僅當您在實時項目上工作時才需要1,2個步驟,實際的項目代碼包含很多邏輯。 如果您可以理解,則可以省略1步和2步。

因此,您可以輕松了解Scala代碼的確切含​​義。

這看起來很麻煩,但是不會花費很多時間。 並使其理解自己,而不是別人解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM