簡體   English   中英

Scala 3中抽象方法是如何初始化的?

[英]How is abstract method initialiazed in Scala 3?

下面Scala 3碼

trait MyTrait:
  println("MyTrait initialization – start")
  val value: Int
  def data: String
  println(s"MyTrait initialized end with value=$value, data=$data")

@main
def main(): Unit = {
  new MyTrait: // anonymous subclass
    println("Anonymous subclass initialization – start")
    val value = 1
    def data =
      println("Calling data inside anonymous subclass")
      "abc"
    println("Anonymous subclass initialization – end")
}

印刷

MyTrait initialization – start
Calling data inside anonymous subclass
MyTrait initialized end with value=0, data=abc
Anonymous subclass initialization – start
Anonymous subclass initialization – end

我不明白為什么它打印data=abc 它不應該打印一些默認值或編譯錯誤嗎?


初始化順序是MyTrait之后是匿名子類。 MyTrait中,抽象成員應該設置為它們的默認值——這適用於value ,因為它打印0 但是,對於方法data ,它以某種方式跳過此初始化順序並在初始化應該發生之前從匿名子類調用具體data方法。

val s 和var s(或技術上支持它們的字段)使用默認值初始化。 def s(又名方法)在編譯時有效綁定,虛擬方法分派意味着可以在 class 的構造函數完成之前調用這些方法。

有效流程為:

  • 為匿名子類分配 memory(此時def data綁定到匿名子類的實現,字段具有默認值)
  • 調用匿名子類的構造函數
  • ...調用特征的構造函數
  • 然后運行子類構造函數主體的 rest

暫無
暫無

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

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