我發現a great explanation of how trait is compiled to Java code,但我認爲它缺少一個「抽象覆蓋」功能。爲此功能生成了哪些Java代碼?抽象重寫如何根據Java代碼工作?
4
A
回答
6
這裏說到:
它短,abstract override def m()
允許地方型的呼叫從方法super.m()
和這個超級呼叫界限dynamicaly創造,當一個特質混合在後種所有其他類型,例如
trait Printer {
def print(msg: String)
}
trait Shouter extends Printer {
abstract override def print(msg: String) { super.print(msg + "!") }
}
class ConsolePrinter extends Printer {
def print(msg: String) { println(msg) }
}
val loudPrinter = new ConsolePrinter with Shouter
loudPrinter.print("Scala is great")
在這裏,我們的混合式呼喊後,輸入線性化後變成了「呼喊延伸ConsolePrinter」,並super.print()
通話變得ConsolePrinter.print()
,它給我們:
Scala is great!
谷歌更多的「堆疊特質模式」,這是一件了不起的事! :)
哎......我忘了有關Java :)
對於給定的例子中,我們有Shouter.class - 接口呼喊與方法:
[0] Shouter$$super$print
[1] print
接下來,呼喊$類的.class - 名爲「呼喊$類」用靜態方法print(LShouter;Ljava/lang/String;)V
和身體具體類:
0 aload_0
1 new #8 <scala/collection/mutable/StringBuilder>
4 dup
5 invokespecial #12 <scala/collection/mutable/StringBuilder.<init>>
8 aload_1
9 invokevirtual #16 <scala/collection/mutable/StringBuilder.append>
12 ldC#18 <!>
14 invokevirtual #16 <scala/collection/mutable/StringBuilder.append>
17 invokevirtual #22 <scala/collection/mutable/StringBuilder.toString>
20 invokeinterface #28 <Shouter.Shouter$$super$print> count 2
25 return
也就是說,呼籲通過實例方法Shouter$$super$print(String)
。
接下來,$$anon$1.class
- 具體類名爲「$ anon $ 1」 - 這是我們的new ConsolePrinter with Shouter
。它實現了接口Shouter,也就是說,它的方法實現了。在這裏:
print(Ljava/lang/String;)V
0 aload_0
1 aload_1
2 invokestatiC#21 <Shouter$class.print>
5 return
Shouter$$super$print(Ljava/lang/String;)V
:
0 aload_0
1 aload_1
2 invokespecial #11 <ConsolePrinter.print>
5 return
也就是說,在被稱爲print()
我們調用static Shouter$class.print()
這是從呼喊特質的實現。該打印文件添加!
並在我們的對象上調用Shouter $$ super $ print(),並且我們將調用轉發給ConsolePrinter。
這是它。
相關問題
- 1. 根據CPU週期重構代碼JAVA
- 2. 在Java中重寫抽象方法
- 3. Java的抽象方法不重寫
- 4. 抽象方法重寫抽象方法
- 5. 重寫抽象類的抽象成員
- 6. 不是抽象的,不重寫抽象
- 7. 爲windows和web編寫抽象代碼?
- 8. 如何利用抽象方法重寫?
- 9. 重寫.htaccess代碼工作與子域
- 10. .htaccess重寫代碼不工作
- 11. 我無法讓重寫代碼工作
- 12. 在Java中的重寫抽象方法中的代碼問題枚舉
- 13. Android源代碼,Java跟蹤,抽象類
- 14. 重寫java代碼到groovy代碼
- 15. Golang抽象,以避免重複代碼
- 16. 的Java 7,但不是Java 6:「不是抽象的,不重寫抽象方法」
- 17. 重寫規則如何在我的代碼中工作?
- 18. 抽象類重寫錯誤
- 19. 重寫抽象方法TimerTask.Run()
- 20. 工作隊列的Java併發抽象
- 21. 如何重寫代碼
- 22. 此Java代碼如何工作?
- 23. 此Java代碼片段如何工作?
- 24. 如何根據工作表的代號設置工作表對象?
- 25. 抽象類,如何避免代碼重複?
- 26. 重寫代碼%>%操作
- 27. 抽象翻譯器如何工作?
- 28. 如何根據Java EE中的數據庫記錄重寫URL
- 29. 如何通過ScalaMock將受保護的抽象方法抽象java類存根?
- 30. 抽象子類如何在Java中工作?
也看看這個答案http://stackoverflow.com/questions/7637752/using-scala-traits-with-implemented-methods-in-java – tuxSlayer 2012-02-28 21:17:25