我正在閱讀Martin Odersky等人編寫的「Programming in Scala」中的特性章節(2ed),我對靜態綁定的類中的super
聲明感到困惑,不像它在動態綁定的特性中(p。 220)。超類靜態綁定類嗎?
我明白這個說法,但是當涉及到例如像這樣的:
val queue = (new BasicIntQueue with Incrementing with Filtering)
在第229頁或線性化(第234頁)的全部解釋,在我看來,那super
不能靜態地因爲否則堆疊特徵將不可能 - 即當類「開始」已經解決了super
堆疊方法的調用鏈時,無論用戶添加到特徵堆棧中,它都將直接觸擊父類。
我錯過了什麼? :-) super
是否真的靜態綁定到它的父項?
當你在堆棧類中調用'super'方法時,它總是在其中一個父特徵中調用一個特定的方法,對吧?編譯器知道對象的確切靜態類型,包括它繼承的所有特徵。就我所見,沒有任何東西可以阻止靜態調度。 –
@VladimirMatveev,ad。 「堆疊班級中的方法」。該方法來自'BasicIntQueue'類,該方法是爲該類編寫和編譯的,而不知道將來如何使用它。然而'超級'被重新路由。正如我所說,也許我在這裏錯過了一些東西。 – greenoldman
雖然此方法確實來自'BasicIntQueue',它在每個可堆棧特徵中都被覆蓋,這意味着每個特徵還包含此方法。你可以很容易地在'javap'輸出中找到它們。無論如何,對於非靜態方法,沒有像Java字節碼中的靜態分派那樣的東西。字節碼將包含用於常規方法的'invokevirtual'和用於接口方法的invokeinterface(用於構造函數的'invokespecial'和用於其他內容的invokedynamic')。這些方法仍然必須針對虛擬表格進行解析,除非使用了內聯等一些優化。 –