[英]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 的構造函數完成之前調用這些方法。
有效流程為:
def data
綁定到匿名子類的實現,字段具有默認值)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.